文章目录
- 一、神经网络的基本构成部分
- 1.1 神经元
- 1.2 单层神经网络
- 1.3 多层神经网络
- 1.4 非线性激活函数(activation functions)
- 1.5 输出形式
- 二、神经网络的训练方式
- 2.1 损失函数
- 2.2 梯度下降法
- 2.3 反向传播(Backpropagation)
- 三、词向量:Word2vec
- 3.1 CBOW
- 3.2 Skip-Gram
- 3.3 负采样
- 学习单词嵌入的其他技巧
- 四、常见的神经网络结构
- 4.1 循环神经网络(Recurrent Neural Networks,RNNs)
- 4.1.1 门控循环单元(Gated Recurrent Unit,GRU)
- 4.1.2 长短期记忆网络(Long Short-Term Memory Network,LSTM)
- 4.1.3 双向 RNN(Bidirectional RNNs)
- 4.2 卷积神经网络(Convolutional Neural Networks,CNN)
- 参考
发现了一个有趣的视频集合【官方双语】神经网络基本思想,从零开始理解深度学习!讲解非常非常通俗,还可以锻炼英语听力,BAM!!!
初进该领域,希望能和大家一起交流 o( ̄▽ ̄)ブ,有什么问题可以在下面评论哦????
一、神经网络的基本构成部分
神经网络的全称是人工神经网络(Artificial Neural Network),是受生物神经网络所启发的。
1.1 神经元
生物中的神经网络主要由一个又一个的神经元的细胞构成的,其中每一个神经元的细胞会从它的树突中去接受来自于其他细胞的若干信号作为输入,这个细胞处理了这些输入之后,会从轴突去输出若干个信号。
受到这个生物里面的神经网络和神经元的启发,我们可以设计出由计算机能够计算的人工神经元(简称神经元)。这个神经元在左边会接受 n 个数作为输入,然后在右边产生一个数的输出。这个神经元由参数 w 和 b 以及激活函数 f 构成。
如下图所示,这个神经元有三个输入
x
1
,
x
2
,
x
3
x_1,x_2,x_3
x1,x2,x3,对应的三个权重分别为
w
1
,
w
2
,
w
3
w_1,w_2,w_3
w1,w2,w3。我们会计算一个乘积和
x
1
w
1
+
x
2
w
2
+
x
3
w
3
x_1w_1+x_2w_2+x_3w_3
x1w1+x2w2+x3w3,然后将这个值与偏置
b
b
b 相加。这相当于输入有四个,其中第四个恒为1,而第四个输入对应的权重为
b
b
b,这样偏置的计算可以统一到前面计算乘积和的步骤中。接着,这个乘积和会经过一个非线性的激活函数,然后就会得到这一个神经元的输出。
这个计算过程可以被形式化地表示为下面这个式子:
h
w
,
b
(
x
)
=
f
(
w
T
x
+
b
)
h_{\boldsymbol{w},b}(\boldsymbol{x})=f(\boldsymbol{w}^T\boldsymbol{x}+b)
hw,b(x)=f(wTx+b) 我们把权重
w
\boldsymbol{w}
w 和输入
x
\boldsymbol{x}
x 写成了粗体,表示它们是个向量。
1.2 单层神经网络
利用多个这样的神经元联系在一起,可以构成一个这样只有一层的的神经网络,如下图,这个神经网络是由 3 个神经元构成的。
在具体计算的时候,我们可以认为右边的 3 个神经元可以并行计算,它们按照上面的方式分别得到一个值(如下图中的a1,a2,a3),这时这一层的计算可以用
a
=
f
(
W
x
+
b
)
\boldsymbol{a}=f(\boldsymbol{Wx}+\boldsymbol{b})
a=f(Wx+b) 来表示,其中权重从向量变成了一个矩阵(
W
12
W_{12}
W12 表示这个数和
x
2
x_2
x2 相乘,作为第 1 个神经元的一部分输入),偏置从标量变成了一个向量,
f
f
f 作用在一个向量上时先对其中的每一个值分别进行运算再将结果组成一个同型的向量。
1.3 多层神经网络
在单层神经网络之后,我们还可以继续叠加类似的层,变成一个多层的神经网络,其中每层都有若干个神经元。计算的时候从最左边的输入开始,依次计算每一层的结果,其中每一层的输出结果会作为下一层的输入,这就是前向计算。
我们通常把在输入之上添加的多层网络称之为隐层(hidden layers),然后输入部分称之为输入层(input layer)。隐层的输出通常使用
h
\boldsymbol{h}
h 来表示,如下图中的
h
1
\boldsymbol{h_1}
h1,
h
2
\boldsymbol{h_2}
h2 和
h
3
\boldsymbol{h_3}
h3。
为了得到输出结果,我们需要在神经网络最右边再网络的最后一层,即输出层(output layer)
1.4 非线性激活函数(activation functions)
接下来介绍一下这个非线性的激活函数。
首先我们先假定神经网络中并没有激活函数,神经网络中就只存在线性运算了,比如对于两层的神经网络,两层的运算其实可以被表示成单层的运算,也就是说在这样情况下,多层网络和单层网络的表达能力是相同的。
因此我们需要引入非线性的激活函数,这样可以防止多层神经网络塌缩为一层的神经网络,我们也可以通过更加复杂的激活函数来加强多层网络的表达能力。
一些常见的激活函数有:
-
Sigmoid:
f
(
z
)
=
1
1
+
e
−
z
f(z)=\frac{1}{1+e^{-z}}
f(z)=1+e−z1
f ( 0 ) = 0.5 f(0)=0.5 f(0)=0.5,值域: ( 0 , 1 ) (0,1) (0,1)
-
Tanh:
f
(
z
)
=
t
a
n
h
(
z
)
=
e
z
−
e
−
z
e
z
+
e
−
z
f(z)=tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}
f(z)=tanh(z)=ez+e−zez−e−z
f ( 0 ) = 0 f(0)=0 f(0)=0,值域: ( − 1 , 1 ) (-1,1) (−1,1)
-
ReLU:
f
(
z
)
=
m
a
x
(
z
,
0
)
f(z)=max(z,0)
f(z)=max(z,0)
f ( 0 ) = 0 f(0)=0 f(0)=0,值域: ( 0 , + ∞ ) (0,+∞) (0,+∞)
1.5 输出形式
假设神经网络只有一层隐含层,输出层只有一个神经元,输出方式主要有两种。
第一种不使用激活函数,直接线性输出:
y
=
w
T
h
+
b
y=\boldsymbol{w}^T\boldsymbol{h}+b
y=wTh+b
第二种使用 sigmoid 激活函数:
y
=
σ
(
w
T
h
+
b
)
y=\sigma(\boldsymbol{w}^T\boldsymbol{h}+b)
y=σ(wTh+b),这种形式常用于二分类问题,使用
y
y
y 表示一类,而使用
1
−
y
1-y
1−y 表示另外一类
当输出使用 softmax 激活函数,它主要用来解决多分类的问题。对于只有一层隐含层的神经网络,输出层有几个神经元就代表有几种类别,输出相当于一个概率分布。比如下图表示要分类三个类别。
其中具体输出为:
二、神经网络的训练方式
2.1 损失函数
首先我们需要设定一个目标,根据这个目标去不断调节整个神经网络,即不断去最小化损失函数的值。
对于线性回归任务,比如有
N
N
N 个训练样本
(
x
i
,
y
i
)
i
=
1
N
{(x_i, y_i)}^N_{i=1}
(xi,yi)i=1N,其中
x
i
x_i
xi 和
y
i
y_i
yi 分别表示一台电脑的属性和价格,我们想要训练的神经网络
F
θ
(
⋅
)
F_\theta(·)
Fθ(⋅) 将属性
x
x
x 作为输入,然后输出预测价格
y
y
y。一个合理的训练目标是最小化均方误差(Mean Squared Error):
其中
θ
\theta
θ 是神经网络
F
θ
(
⋅
)
F_\theta(·)
Fθ(⋅) 中的参数。
对于文本分类任务,比如比如有 N N N 个训练样本 ( x i , y i ) i = 1 N {(x_i, y_i)}^N_{i=1} (xi,yi)i=1N,其中 x i x_i