神经网络
神经网络,不再是单纯的单层线性计算,而加入了非线性层
也被称为全连接网络或者有时候被称为多层感知机
激活函数
函数 max(0,z)被称为激活函数
如果没有激活函数,多层的线性计算都可以化为一层的线性计算。又变成了一个线性分类。
为什么需要非线性
因为在现行条件下,很多是线性不可分的,因此需要进行一定的特征转换才能可分。
几种常见的激活函数
import numpy as np
from numpy.random import random
N, D_in, H, D_out = 64,1000, 100, 10
x, y = randn(N,D_in), rand(N,D_out)
w1, w2 = randn(D_in, H), randn(H, D_out)
for t in range(2000):
# 两层神经网络
h = 1 / (1 + np.exp(-x.dot(w1)))
y_pred = h.dot(w2)
loss = np.square(y_pred - y).sum()
print(t, loss)
grad_y_pred = 2.0 * (y_pred - y)
grad_w2 = h.T.dot(grad_y_pred)
grad_h = grad_y_pred.dot(w2.T)
grad_w1 = x.T.dot(grad_h*h*(1 - h))
w1 -= 1e-4 * gred_w1
w2 -= 1e-4 * gred_w2
神经网络的loss
这么复杂的方程,我们如何计算梯度? 如果用在纸上推到的方式,我们需要进行很大的计算量。如果使用softmax替换SVM呢?岂不是要重新推导?
更好的方法,使用计算图和反向传播
神经网络会做的非常大,使用人去推到梯度计算的公式显然是不太现实的
反向传播
将计算图中的部分拿出来,我们可以将其看作不同的类型的gate
注意max gate,对于较小的值,导数可以为0,对于较大的值,local gradient 为 1
向量形式的反向传播公式
向量求导
向量的梯度和变量本身有相同的维度。
如果是矩阵形式,在计算local gradients的时候会计算一个非常大的 Jacobian 矩阵
可以推一波
我们可以直接使用矩阵梯度求导的公式。