神经网络的学习

损失函数
表示神经网络性能的“恶劣程度”的指标,即当前的神经网络对监督数据在多大程度上不拟合,不一致。可以使用任意函数,一般用均方误差和交叉熵误差。
均方误差
这里,\(y_k\) 表示神经网络的输出, \(t_k\) 表示监督数据,\(k\) 表示数据的维度。
one-hot表示:将正确的标签表示为 \(1\),其他标签表示为 \(0\)。
交叉熵误差
这里,\(log\) 表示以 \(e\) 为底数的自然对数,\(y_k\) 为神经网络的输出,\(t_k\) 是正确的标签。
该式实际上只计算对应正确解标签的输出的自然对数,比如:假设正确解标签的索引为 \(2\),与之相对应的神经网络的输出为 \(0.6\),则交叉熵误差为 \(-log\ 0.6=0.51\)。

用以下代码实现交叉熵误差:
import numpy as np
def cross_entropy_error(y,t):
delta=1e-7
return -np.sum(t*np.log(y+delta))
这里,\(y\) 和 \(t\) 是 \(numpy\) 数组。函数内部在计算 \(np.log\) 时,加上一个微小值 \(delta\) ,是为了防止出现 \(np.log(0)\) 的情况。
mini-batch学习
机器学习使用训练数据进行学习时,就是针对训练数据计算损失函数的值,找出使该值最小的参数。如果训练数据很多的话,就要求所有的训练数据的损失函数的总和。
则交叉熵误差可以写成如下形式:
这里,假设数据有 \(N\) 个,\(t_{nk}\) 表示第 \(n\) 个数据的第 \(k\) 个元素的值(\(y_{nk}\) 是神经网络的输出,\(t_{nk}\) 是监督数据)。只是将数据扩大到 \(N\) 份数据,最后除以 \(N\) 进行正规化。通过除以 \(N\) ,可以求出单个数据的“平均损失函数”。即这样的平均化,可以获得和训练数据的数量无关的统一标准。
正规化:主要用于避免过拟合的产生和减少网络误差。
mini-batch学习:从训练数据中选出一部分数据进行学习。
mini-batch版交叉熵的实现
import numpy as np
def cross_entropy_error(y,t):
if y.ndim==1:#数组的维度
t=t.reshape(1,t.size)#数组的重塑,用于后面的运算
y=y.reshape(1,y.size)
batch_size=y.shape[0]#第二维长度,shape[1]表示第一维长度
return -np.sum(t*np.log(y+1e-7))/batch_size#对应位置相乘
当输入 \(y\) 的维度是 \(1\) 时,即求单个数据的交叉熵误差时,需要改变数据的形状。
当监督数据采用标签形式,代码实现如下:
import numpy as np
def cross_entropy_error(y,t):
if y.ndim==1:
t=t.reshape(1,t.size)
y=y.reshape(1,y.size)
batch_size=y.shape[0]
return -np.sum(np.log(y[np.arange(batch_size),t]+1e-7))/batch_size
数值微分
舍入误差:指因省略小数的精细部分的数值而导致的最终结果上的误差。即使用过小的值会造成计算机出现计算上的问题。
利用 \(lim_{h\to 0}\ \frac{f(x+h)-f(x)}{h}\) 求出的数值微分,因为 \(h\) 并不可能无限接近 \(0\),存在误差。为了减小误差,采用 中心差分 ,即计算 \(lim_{h\to 0}\ \frac{f(x+h)-f(x-h)}{2h}\)

浙公网安备 33010602011771号