感知机
感知机是接受多个输入信号,并转换为一个输出信号的东西。输入信号输入神经元,乘以相应的权重,并计算总和,总和超过某一个界限值时,才会输出1,也被称为神经元激活。
局限性:
感知机的局限性在于它只能表示一条直线分割的线性空间,可以通过叠加层实现非线性空间。理论上多层感知机可以实现计算机的功能。
神经网络
神经网络可以自动地从数据中学习到合适地权重参数。
激活函数
将输入信号的总和转换为输出信号。神经网络中常用的激活函数为阶跃函数,sigmoid函数和ReLU函数。
激活函数必须使用非线性函数,因为线性函数无论怎样加深层数,总是有与之等效的“无隐藏层的神经网络”
阶跃函数
输入超过0,输出1,否则输出0.
具体实现
# 阶跃函数
def step_function (x):
y = x > 0
return y.astype(np.int)
sigmoid函数
函数图像
sigmoid函数图像是一条平滑的曲线,输出随着输入发生连续性变化,且可以输出实数值。
# sigmoid函数
def sigmoid (x):
return 1 / (1 + np.exp(-x))
ReLU函数
在输入大于0时,直接输出该值,否则输出0
# relu函数
def relu(x):
return np.maximum(0, x)
输出层的激活函数
一般的,根据求解问题的性质,回归问题可以使用恒等函数,二元分类问题可以使用sigmoid函数,多元分类问题可以使用softmax
函数。
# softmax函数
def softmax(a):
c = np.max(a)
exp_a = np.exp(a - c)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
softmax输出是0.0到1.0之间的实数,并且softmax输出值总和是1。这样计算有可能会出现溢出的错误,可以通过加常数放出出现此错误。
神经网络的自主学习
神经网络的特征就是可以根据数据自动确定权重参数
损失函数
损失函数是神经网络性能恶劣程度的指标,可以使用任意函数,一般使用均方误差和交叉熵误差。
为什么使用损失函数
在神经网络的学习中,如果以识别精度为指标,则参数的导数在绝大多数地方为0,因为微调权重等参数改变的识别精度变化不连续,而以损失函数为指标,则会发生连续性变化。同理,阶跃函数不能作为神经网络的激活函数,而sigmoid不仅连续,而且导数在任何地方都不为0.
均方误差
交叉熵误差
tk中只有正确解标签索引为1,其他均为0
python实现
def cross_entropy_error(y, t):
delta = 1e-7 #防止出现log(0)
return -np.sum(t * np.log(y + delta))
梯度
由全部向量的偏导数汇总成的向量,梯度指示的方向是各点函数值减小最多的方向。
#梯度的python实现
def numerical_gradient(f, x):
h = 1e-4
grad = np.zeros_like(x) #生成与x形状相同的数组
for idx in range(x.size) :
tmp_val = x[idx]
x[idx] = tmp_val + h
fxh1 = f(x)
x[idx] = tmp_val - h
fxh2 = f(x)
grad[idx] = (fxh1 - fxh2) / (2 * h)
x[idx] = tmp_val
return grad
梯度法
从当前位置沿着梯度方向前进一定距离,然后在新的地方重新求梯度,再沿着梯度方向前进,逐渐减小函数值。
负梯度:梯度法中变量更新的方向
梯度会指向各点处函数值减小最多的方向
η为学习率,决定在多大程度上更新参数,实现反复学习决定。
def gradient_descent(f, init_x, lr = 0.01, step_num = 100):
x = init_x
for i in range(step_num) :
grad = numerical_gradient(f, x)
x -= lr * grad
return x
神经网络学习的四个步骤
- mini-batch:从训练数据中随机选出一部分数值
- 计算梯度,为了减少mini-batch的损失函数的值,需要求出多个权重参数的梯度,梯度表示损失函数的值减小最多的方向
- 更新参数:将权重参数沿梯度方向进行微小的更新
- 重复1,2,3
以上的方法因为是随机选择mini-batch数据,所以又称为随机梯度下降法(SGD),这个方法优点是实现简单,同时可以作为后文的误差反向传播的梯度确认判断误差反向传播求出的梯度是否正确,但是计算上比较费时间。
epoch:学习中所有训练数据均被使用过一次时的更新次数,每经过一个epoch,就对所有的训练数据和测试数据计算识别精度。