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)"]
- 计算da:
\[\frac{\partial L}{\partial{a}} = -\frac{y}{a} + \frac{1-y}{1-a}
\]
- 计算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
\]
- 计算得到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则得到前面提到的成本函数。

浙公网安备 33010602011771号