深度学习之线性模型与神经网络
神经网络是对线性模型的升级,使之能对线性不可分的数据集达到好的分类效果。
在线性模型中,利用矩阵乘法得到由图像像素到分值向量的映射,图像的像素被拉伸成一个输入行向量,参数是矩阵,输出是分值向量,其维数是类别的数量。
相比于线性模型,神经网络的核心是引入非线性激活函数和多层结构。
1. 非线性激活函数
- sigmoid 激活函数
- tanh 激活函数
- ReLU 激活函数
- Leaky ReLU 激活函数
- PReLU 激活函数
- ELU 激活函数
在同一个网络中一般使用同一种激活函数,而不混合使用多种激活函数
在目前的实践中,推荐使用 ReLU 激活函数。
tanh理论上不如ReLU, 不推荐使用tanh
2. 多层结构
每次线性变换的输出向量都需要进行非线性变换。注意:最后一次的线性变换不需要进行非线性变换,因为最后的输出y多用于表示分值(分类),可以是任意的实数值,或者是实数值的目标值的回归。
例如:三次变换的公式为:
h1=f(xW1) h2=f(h1W2) y=h2W3
- 在神经网络术语中, x是输入层, y称为输出层, 中间变换层h1和h2称为隐含层,非线性函数f称为激活函数。
- 存在多少次线性变换,就称为多少层神经网络,所以上面的网络是三层网络。
- 网络的深度是网络的层数。
- 隐含层向量的维数称为网络宽度。
- 向量元素称为神经元。
3. 代码实现
3.1 线性模型
s1=x1W+b
s2=x2W+b
...
sn=xnW+b
得到
S=XW+B
每个样本的分值向量组成分值矩阵S的一行,每个样本属性向量组成样本属性矩阵X的一行。矩阵X也称为数据矩阵,偏置矩阵B的每行都是偏置向量b, W为输入各向量对应的权重,都一样。
代码: 线性模型(定义)
import numpy as np
D=784 # 数据维度
K=10 # 类别数
N=128 # 样本数量
X=np.random.rand(N,D) # 数据矩阵
W=0.01*np.random.randn(D,K)
b=np.zeros((1