文章目录
一、概述神经网络
1.1 项目背景:个性化推荐意义
注册商标问题,papi酱 网名被注册
初始词向量
-
项目环境:
-
Python和Tensorflow
python: pip install tensorflow
Anaconda: conda install tensorflow
1.2 神经网络基础知识精讲
基础知识
- 是一个黑箱算法,可解释性不强
hidden layer 隐藏层,不可见,数值不是训练前可以知道的
inputlayer 输入层:都是实数 - 输入–>函数:线性函数(可以嵌套)但是还是线性函数,
所以引用非线性函数(activation function)增强神经网络表达能力
激活函数不可导的梯度函数,在求极值的时候,无法使用梯度下降法(求导数来求极值) - 神经网络表达能力和可解释性:
足够的深度和宽度可以拟合任何一个复杂的函数(神经网络 manifold 理论),反之则拟合不足
若宽度不足,深度很深也不行
反向传播与梯度下降法
- loss 损失函数
机器学习/数据挖掘模型 的目的,拟合一个函数,通过构造损失函数(loss),希望损失尽可能小,找一个函数使得loss尽可能小
用导数求极小值,求导就叫做反向传播 - 梯度问题
- 导数链式法则
若导数(变化率)小,经过很多层网络求导,他们的积接近于零,–>梯度消失
若导数(变化率)大,经过很多层网络求导,他们的积接近无限大,–>梯度爆炸 - 激活函数导数
- 梯度下降方法:
在神经网络中,参数初始值的选取,是优化的重要参数
随机选取n个初始值,进行n次迭代 - 梯度下降(Gradient Descent),步长抖动(步长不能太大,太小收敛太慢)
- 解决梯度的方法:
1–Lstm(long short-term memory)长短期记忆,用来解决RNN模型梯度问题
(recursive/recurrent neural network 递归/周期神经网络,早期的记忆也会成为输入)
2–选择特殊的激活函数ReLU(修正线性单元)
Batch size 训练样本大小
迭代算法对每一批样本,只走一步
Batch size太小抖动大,太大则训练不明显,收敛满,要适当的小
- 导数链式法则
1.3 word2vec 词向量原理
- 对词进行编码及评价效果–连续性
用夹角的余弦值表示词意思之间的距离,余弦值越大,两个词之间的意思越接近 - 传统方法:利用term-doc matrix(词-文档矩阵)对词进行编码
只能表示词出现的频次,词与词之间的距离无法体现
-
onehot 编码优缺点,以及限制
-
纬度高,新词没有对应的编码
因为onehot编码很多位是0,最终神经网络计算量不大
可以只考虑高频词,从而避免过分膨胀
word2vec优点
-
1 分布假说(只考虑近距离的词,语境/上下文)
2 在小范围内,可以不考虑字的顺序
3 试验表明,考虑太多细节(比如语法)效果不一定更好
word2vec 神经网络模型
-
cbow方法的网络模型
-
cbow(continuous bag of words l连续词袋)
与BoW一样,抛弃了词序信息,然后窗口在语料上滑动,成就了连续词袋
输入上下文—> 输出中心词
skip-gram 方法的网络模型
- 1 三层神经网络
- 2 中间层(第二层)没有激活函数(sigmoid)。避免语义过度抽象
-
3 输出层(第三层)又激活函数softmax
采样过程,忽略一部分的词
输入中心词—> 输出上下文
从 onehot 编码–>自编码
-
word2vec 代码剖析 skip-gram
word2vec 之cbow
word2vec 运行结果分析
模型训练标准
模型测试标准
1.4 协同过滤:item embedding
-
采用embedding技术实现推荐系统时效性–新闻阅读和个性化推荐
- 1 关键词 textrank 根据两个词互相投票来确定一个词的重要性 pagerank’财经’,‘发展’,‘银行’/3 来计算平均向量
- 2 投票用词向量夹角余弦来计算
-
3 textrank
优点:不管一片文章中两个词的相隔距离,根据相应的词向量,计算相似度 - 4 归类,计算平均向量 与各个类别向量的距离 可以对文章进行归类
1.5 应用方向
-
初始推荐系统
- 推荐系统知识
新浪网:猜你喜欢
网易: 今日点击
新闻T字形标签提取
新闻推荐
- 推荐系统知识
-
总结和拓展
总结
自编码网络
二、反向传播
2.1 DNN反向传播算法
2.2 CNN反向传播算法
对比深度神经网络反向传播算法,卷积神经网络反向传播算法需要解决以下几个问题。
由于卷积层可以有多个卷积核,各个卷积核之间的处理方式是完全相同的,为了简化算法公式的复杂度,下面推导时只针对卷积层中若干卷积核中的一个。
-
池化层的反向传播
池化层没有激活函数可以直接看成用线性激活函数,即 σ ( z ) = z σ(z)=z σ(z)=z,所以 σ ′ ( z ) = 1 σ^′(z)=1 σ′(z)=1。接下来看看池化层如何递推 δ l δ^l δl。在前向传播时,我们一般使用 max或 average对输入进行池化,而且池化区域大小已知。反向传播就是要从缩小后的误差 δ l + 1 δ^{l+1} δl+1,还原池化前较大区域对应的误差 δ l δ^l δl。根据(2)式子,在DNN中 w l + 1 w^{l+1} wl+1是已知的,所以我们可以直接通过矩阵乘法将 l + 1 l+1 l+1 层的误差映射回 l l l 层的误差,但对于池化层,要求 ( w l + 1 ) T δ l + 1 (w^{l+1})^T \delta^{l+1} (wl+1)Tδl+1 就需要一些特殊的操作了。
用一个例子可以很清楚的解释这一过程:假设现在我们是步长为1的 2×2 池化,4×4大小的区域经过池化后变为2×2。如果 δ l δ^l δl 的第 k个子矩阵为: δ k l = [ 2 8 4 6 ] (5) \delta_k^l = \begin{bmatrix} 2 &8 \\ 4 & 6 \end{bmatrix} \tag5 δkl=[2486](5)
首先我们对
δ
k
l
\delta_k^l
δkl 进行还原。 如果是max pooling,我们只需要记录前向传播中最大值的位置,然后将误差放回去即可。如果最大值位置分别为 2×2 的左上,右下,右上,左下进行转换:
δ
k
l
=
[
0
0
0
0
0
2
8
0
0
4
6
0
0
0
0
0
]
⇒
转
换
后
[
2
0
0
0
0
0
0
8
0
4
0
0
0
0
6
0
]
(6)
\delta_k^l =\begin{bmatrix} 0 & 0 & 0 & 0\\ 0 & 2 & 8 & 0\\ 0 & 4 & 6 & 0\\ 0 & 0 & 0 & 0 \end{bmatrix}\xRightarrow{转换后} \begin{bmatrix} 2 & 0 & 0 & 0\\ 0 & 0 & 0 & 8\\ 0 & 4 & 0 & 0\\ 0 & 0 & 6 & 0 \end{bmatrix} \tag6
δkl=⎣⎢⎢⎡0000024008600000⎦⎥⎥⎤转换后⎣⎢⎢⎡2000004000060800⎦⎥⎥⎤(6)
如果是average pooing,我们只需要将池化单元的误差平均值放回原来的子矩阵即可:
[
0.5
0.5
2
2
0.5
0.5
2
2
1
1
1.5
1.5
1
1
1.5
1.5
]
(7)
\begin{bmatrix} 0.5 & 0.5 & 2 & 2\\ 0.5 & 0.5 & 2 & 2\\ 1 & 1 & 1.5 & 1.5\\ 1 & 1 & 1.5 & 1.5 \end{bmatrix} \tag7
⎣⎢⎢⎡0.50.5110.50.511221.51.5221.51.5⎦⎥⎥⎤(7)
2.3 卷积层的反向传播
列出a,W,z的矩阵表达式如下:
[
z
11
z
12
z
21
z
22
]
=
[
a
11
a
12
a
13
a
21
a
22
a
23
a
31
a
32
a
33
]
∗
[
w
11
w
12
w
21
w
22
]
(9)
\begin{bmatrix} z_{11} & z_{12}\\ z_{21} & z_{22} \end{bmatrix}= \begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23}\\ a_{31} & a_{32} & a_{33} \end{bmatrix}*\begin{bmatrix} w_{11} & w_{12}\\ w_{21} & w_{22} \end{bmatrix} \tag9
[z11z21z12z22]=⎣⎡a11a21a31a12a22a32a13a23a33⎦⎤∗[w11w21w12w22](9)
利用卷积的定义,很容易得出:(是卷积计算哦,不是点乘)
z
11
=
a
11
w
11
+
a
11
w
12
+
a
21
w
21
+
a
22
w
22
z
12
=
a
12
w
11
+
a
11
w
12
+
a
22
w
21
+
a
23
w
22
z
21
=
a
21
w
11
+
a
11
w
12
+
a
31
w
21
+
a
32
w
22
z
22
=
a
22
w
11
+
a
11
w
12
+
a
32
w
21
+
a
33
w
22
(10)
\begin{aligned} z_{11} &=a_{11}w_{11}+a_{11}w_{12}+a_{21}w_{21}+a_{22}w_{22} \\ z_{12} &=a_{12}w_{11}+a_{11}w_{12}+a_{22}w_{21}+a_{23}w_{22} \\ z_{21} &=a_{21}w_{11}+a_{11}w_{12}+a_{31}w_{21}+a_{32}w_{22} \\ z_{22} &=a_{22}w_{11}+a_{11}w_{12}+a_{32}w_{21}+a_{33}w_{22} \end{aligned} \tag{10}
z11z12z21z22=a11w11+a11w12+a21w21+a22w22=a12w11+a11w12+a22w21+a23w22=a21w11+a11w12+a31w21+a32w22=a22w11+a11w12+a32w21+a33w22(10)
2.4 推导卷积层梯度(W,b)
2.5 CNN反向传播算法总结
输入:m个图片样本,CNN模型的层数L和所有隐藏层的类型。对于卷积层,要定义卷积核的大小K,卷积核子矩阵的维度F,填充大小P,步幅S。对于池化层,要定义池化层区域大小k和池化标准(Max或Average)。对于全连接层,定义全连接层的激活函数(输出层除外)和各层神经元的个数。梯度迭代步长α,最大迭代次数Max和停止迭代阈值ϵ。
输出:CNN模型各隐藏层与输出层的W,b。