神经网络的学习

损失函数

表示神经网络性能的“恶劣程度”的指标,即当前的神经网络对监督数据在多大程度上不拟合,不一致。可以使用任意函数,一般用均方误差和交叉熵误差。

均方误差

\[E=\frac{1}{2}\sum_{k}{(y_k-t_k)^2} \]

这里,\(y_k\) 表示神经网络的输出, \(t_k\) 表示监督数据,\(k\) 表示数据的维度。

one-hot表示:将正确的标签表示为 \(1\),其他标签表示为 \(0\)

交叉熵误差

\[E=-\sum_{k}{t_k\ log\ y_k} \]

这里,\(log\) 表示以 \(e\) 为底数的自然对数,\(y_k\) 为神经网络的输出,\(t_k\) 是正确的标签。
该式实际上只计算对应正确解标签的输出的自然对数,比如:假设正确解标签的索引为 \(2\),与之相对应的神经网络的输出为 \(0.6\),则交叉熵误差为 \(-log\ 0.6=0.51\)

由图可知,正确解标签输出的值越大,表达式的值越接近 $0$。当输出为 $1$ 时,交叉熵误差为 $0$。

用以下代码实现交叉熵误差:

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学习

机器学习使用训练数据进行学习时,就是针对训练数据计算损失函数的值,找出使该值最小的参数。如果训练数据很多的话,就要求所有的训练数据的损失函数的总和。
则交叉熵误差可以写成如下形式:

\[E=-\frac{1}{N}\sum_{n}{\sum_{k}{t_{nk}\ log\ y_{nk}}} \]

这里,假设数据有 \(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}\)

posted @ 2020-07-08 09:42  whix  阅读(186)  评论(0)    收藏  举报