Loading

WuEnda Lesson2

Week 2 Basics of Neural Network

Computation Graph 计算图

forward:正向通过函数和参数得到结果J

backward:反向计算出\(\frac{dJ}{dvar}\), 在python中,变量名命名为 dvar

Logistic回归中梯度下降法

\[z = w^Tx + b \]

\[\hat{y} = a = \sigma(z) \]

\[L(a,y) = -(y\log{a} + (1-y)\log{(1-a)} ) \]

假设x只有2个变量x1,x2,则有:

\[z = w_1x_1 + w_2x_2+b \]

graph LR A[z = w1x1 + w2x2 + b] --> B["a = sigmoid(z)"] B --> C["L(a, y)"]
  1. 计算da:

\[\frac{\partial L}{\partial{a}} = -\frac{y}{a} + \frac{1-y}{1-a} \]

  1. 计算dz:

\[\frac{\partial L}{\partial z} = \frac{\partial L}{\partial a}\frac{da}{dz} = (-\frac{y}{a} + \frac{1-y}{1-a})[a(1-a)] = a - y \]

  1. 计算得到dw1 = x1*dz和dw2 = x2*dz,w1和w2的梯度下降公式为:

\[w1 := w1 - \alpha \mathrm{d}w1 \]

\[w2 := w2 - \alpha \mathrm{d}w2 \]

梯度下降法的目标是使得J(w, b)尽可能小,令J对w求导:

\[\frac{\partial}{\partial w1}J(w, b) = \frac1m \sum^m_{i=1}\frac{\partial}{\partial w1} L(a^{(i)}, y^{(i)}) \]

m个样本的梯度下降

# 初始化
J = 0, dw1 = 0, dw2 = 0, db = 0
# 遍历样本,将导数累加
for i=1 to m:
  z[i] = wx[i] + b
  a[i] = sigmoid(z[i])
  J += -[y[i]*log(a[i]) + (1 - y[i])log(1 - a[i])]
  dz[i] = a[i] - y[i]
  dw1 += x[i][1]*dz[i]
  dw2 += x[i][2]*dz[i]
  ...
  db += dz[i]
# 计算平均导数
J /= m, dw1 /= m, dw2 /= m,  db /= m
# 梯度下降
w1 -= alpha*dw1
w2 -= alpha*dw2
b -= alpha*db

Vectorization

Non-vectorized:

z = 0
for i in range(n):
  z += w[i]*x[i]
z += b

Vectorized:

z = numpy.dot(w, x) + b

对上面的dw1, dw2, 可以用向量化和Numpy的build-in函数替代for loops:

dw = np.zero((n, 1))
for i=1 to n:
  ...
  dw += x[i]*dz[i]
dw /= m

向量化的Logistic回归

根据:

\[z = w^Tx + b \]

可以得到:

\[Z = [z^{(1)}, z^{(2)}, ..., z^{(m)}] = w^TX + b \]

其中,

\[X = [x^{(1)}, x^{(2)}, ... , x^{(m)}] \]

Z = np.dot(w, X) + b

其他变量同理,得到向量化后的python代码:

Z = np.dot(w.T, X) + b
A = 1/(1 + np.exp(-Z))
dZ = A - Y
dw = 1/m*np.dot(X,dZ.T)
db = np.average(dZ)
# 梯度下降
w -= alpha*dw
b -= alpha*db

Broadcasting in Python

A = np.array([[56.0, 0.0, 4.4, 68.0],
							[1.2, 104.0,52.0,8.0],
							[1.8, 135.0,99.0,0.9]])
cal = A.sum(axis=0)
percentage = 100*A/cal

python中,当一个向量和一个(或规模更小的向量)进行运算,会自动将这个数转换成对应规格的向量。这个过程叫做广播

e.g.

\[\begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ \end{bmatrix} + \begin{bmatrix} 100 & 200 & 300 \\ \end{bmatrix} = \begin{bmatrix} 101 & 202 & 303 \\ 104 & 205 & 306 \\ \end{bmatrix} \]

Wu Enda关于使用Numpy向量的忠告

a = np.random.randn(5)

a.shape = (5, )

上面这种a的数据结构称为“rank 1 array”,不要使用这种隐式的数据结构,而是像下面这样显示地定义变量为一个行/列向量:

a = np.random.randn((5,1))

a.shape = (5, 1)

如果得到了一个“rank 1 array”,使用reshape()将其转换。

logistic 损失函数的解释

If y = 1: p(y|x) = \(\hat{y}\)

if y = 0: p(y|x) = 1 - \(\hat{y}\)

此处的p可以理解为预测的置信度。

合并上面2个式子:

\[p(y|x) = \hat{y}^y(1-\hat{}y)^{(1-y)} \]

由于log(f)不改变f的单调性,最大化p(y|x)等价于最大化log(p(y|x)):

\[\log p(y|x) = y\log \hat{y} + (1-y)\log{(1-\hat{y})} \]

训练的目标是最大化p,也就是最小化损失函数,因此令损失函数为上式的负数。

假设样本服从IID(identically independent distribution),成本函数的最小化就是m个损失函数的最大似然估计:

\[\prod^m_{i=1}p(y^{(i)}|x^{(i)}) \]

同样,对其求log则得到前面提到的成本函数。

posted @ 2021-04-27 23:44  Geasse  阅读(99)  评论(0)    收藏  举报