通过学习阅读图灵图书的《深度学习入门》,对梯度法的深度学习的个人理解如下:
神经网络的学习步骤:
步骤一.从训练数据中随机选出一部分数据,成为mini-batch。训练的目标就是减小mini-batch的损失函数的值;
步骤二.对损失函数求各个权重参数的偏导数,即梯度。梯度即表示损失函数的值减少最多的方向;
步骤三.将权重参数沿梯度方向进行微小更新;
步骤四.重复步骤1,2,3
结合上面的学习步骤,具体的任务如下:
准备:开始实例化神经网络类,确定开始设定的权重参数,使用高斯分布的随机数进行初始化;设置合适的学习率和循环次数
步骤一:选取mini-batch时,采用随机数选择;
步骤二:求梯度时,首先确定清楚是对损失函数求各个偏重参数的偏导数,损失函数loss(self, x, t)常用交叉熵误差cross_entropy_error(y, t),而交叉熵误差函数的参数为神经网络输出y和监督数据t;而y需要调用预测函数predict(self, x),预测函数主要实现神经元矩阵与权重函数矩阵的点乘加上偏置参数,隐藏层的激活函数为sigmoid()函数,输出层为softmax()函数。求梯度时的函数的参数为:损失函数,权重参数,输出权重参数的梯度;
2层神经网络的类如下
class TwoLayerNet:
def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01):
# 初始化权重
self.params = {}
self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size)
self.params['b1'] = np.zeros(hidden_size)
self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size)
self.params['b2'] = np.zeros(output_size)
def predict(self, x):
W1, W2 = self.params['W1'], self.params['W2']
b1, b2 = self.params['b1'], self.params['b2']
a1 = np.dot(x, W1) + b1
z1 = sigmoid(a1)
a2 = np.dot(z1, W2) + b2
y = softmax(a2)
return y
# x:输入数据, t:监督数据
def loss(self, x, t):
y = self.predict(x)
return cross_entropy_error(y, t)
def accuracy(self, x, t):
y = self.predict(x)
y = np.argmax(y, axis=1)
t = np.argmax(t, axis=1)
accuracy = np.sum(y == t) / float(x.shape[0])
return accuracy
# x:输入数据, t:监督数据
def numerical_gradient(self, x, t):
loss_W = lambda W: self.loss(x, t)
grads = {}
grads['W1'] = numerical_gradient(loss_W, self.params['W1'])
grads['b1'] = numerical_gradient(loss_W, self.params['b1'])
grads['W2'] = numerical_gradient(loss_W, self.params['W2'])
grads['b2'] = numerical_gradient(loss_W, self.params['b2'])
return grads
步骤三:更新权重参数
# 更新参数
for key in ('W1', 'b1', 'W2', 'b2'):
network.params[key] -= learning_rate * grad[key]
步骤四:从第一步开始,重新随机选择mini-batch,应用上一轮更新后的权重参数,求梯度,再次更新。。。准备工作中设置了循环次数。
以上为个人学习理解,能力有限,错误之处欢迎各位朋友批评指正!一起学习!