文章目录
预备知识
1. 线性回归 Linear Regression
- 求解目标
y = h θ ( x 1 , x 2 , . . . , x n ) + e , 其 中 建 模 误 差 e = 代 价 函 数 c o s t f u n c t i o n y = h_{\theta}(x_1, x_2, ..., x_n) + e,其中建模误差 e=代价函数cost\space function y=hθ(x1,x2,...,xn)+e,其中建模误差e=代价函数cost function
h θ ( x ) = θ 0 + θ 1 x = [ θ 0 , θ 1 ] [ x 0 x 1 ] h_{\theta}(x) = \theta_0 + \theta_1x =\begin{bmatrix} \theta_{0}, \theta_{1} \end{bmatrix} \begin{bmatrix} x_0 \\ x_1 \end{bmatrix} hθ(x)=θ0+θ1x=[θ0,θ1][x0x1]
线性回归算法优化的目标是:选取最有可能与数据相拟合的直线。数据与直线的误差,称为建模误差 m o d e l i n g modeling modeling e r r o r error error,可侧面反映直线与数据的拟合程度。建模误差由参数 θ 0 \theta_0 θ0 和 θ 1 \theta_1 θ1决定,所以可以表示为 θ 0 \theta_0 θ0 和 θ 1 \theta_1 θ1 的函数,称为代价函数 J ( θ 0 , θ 1 ) J(\theta_0, \theta_1) J(θ0,θ1)。
J ( θ 0 , θ 1 ) = 1 2 m ∑ i = 0 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta_0, \theta_1) = \frac{1}{2m}\sum_{i=0}^{m}(h_{\theta}(x^{(i)})-y^{(i)})^{2} J(θ0,θ1)=2m1i=0∑m(hθ(x(i))−y(i))2
# 代价函数 cost function
def computeCost(x, y, coef):
return np.power( (( x * coef.T) - y ), 2).sum()/(2*len(x))
x = np.hstack((np.ones(len(x)).reshape((-1,1)), x))
x = np.matrix(x)
y = np.matrix(y)
coef = np.matrix(np.array([0,0]))
computeCost(x,y,coef)
m i n i m i z e θ 0 , θ 1 J ( θ 0 , θ 1 ) \underset{\theta_{0}, \theta_{1}}{minimize} \space J(\theta_{0}, \theta_{1}) θ0,θ1minimize J(θ0,θ1)
- 梯度下降法
θ j − ∂ ∂ θ j J ( θ 0 , θ 1 ) = θ j − α m ∑ i = 0 m ( h θ ( x ( i ) ) − y ( i ) ) ∗ x j ( i ) \theta_{j} - \frac{ \partial{} }{ \partial{\theta_{j}} }J(\theta_{0}, \theta_{1}) = \theta_{j} - \frac{\alpha}{m} \sum_{i=0}^{m}(h_{\theta}(x^{(i)})-y^{(i)})*x^{(i)}_{j} θj−∂θj∂J(θ0,θ1)=θj−mαi=0∑m(hθ(x(i))−y(i))∗xj(i)
## 梯度下降
coef = np.matrix(np.zeros(x.shape[1])) # θ_0=0 θ_1=0
for j in range(parameters):
term = np.multiply((x*coef.T) - y,x[:,j]) # (h(x)-y) * x
temp[0,j] = coef[0,j] - ((alpha/len(x)) * np.sum(term))
coef = temp
- 正规方程法
# 正规方程
x = np.c_[np.ones(len(x)),x]
y = np.c_[y]
theta = np.linalg.inv(x.T.dot(x)).dot(x.T.dot(y))
2. 逻辑回归 Logistic Regression
-
引入问题
生活中会遇到许多二分类任务,比如识别邮件是否携带病毒、判别信息是否为诈骗信息以及确认肿瘤的良性与恶性。以肿瘤识别为例,肿瘤大小(tumor size) 为 x x x 值,肿瘤性质为 y y y 值, 0 0 0 代表良性, 1 1 1代表恶性。映射函数为线性回归 h θ ( x ) = θ T x h_{\theta}(\mathbf{x}) = \mathbf{\theta^{T}x} hθ(x)=θTx,阈值设为 0.5 0.5 0.5,二分类判别公式为
y = { 1 h θ ( x ) ≥ 0.5 0 h θ ( x ) < 0.5 y=\begin{cases} 1 & h_{\theta}(\mathbf{x}) \ge 0.5 \\ 0 & h_{\theta}(\mathbf{x}) < 0.5 \end{cases} y={10hθ(x)≥0.5hθ(x)<0.5
线性回归执行二分类任务是比较函数值 h θ ( x ) h_{\theta}(\mathbf{x}) hθ(x) 与阈值 0.5 0.5 0.5,判别 y = 0 y=0 y=0 或 1 1 1。但线性回归分类有时效果较差,右侧的点被识别为良性。同时,线性回归输出结果是实数集,即含有输出 h θ ( x ) < 0 h_{\theta}(\mathbf{x})<0 hθ(x)<0 或 h θ ( x ) > 1 h_{\theta}(\mathbf{x})>1 hθ(x)>1 的情况,实际上我们只需要比较 h θ ( x ) h_{\theta}(\mathbf{x}) hθ(x) 是否大于等于 0.5 0.5 0.5即可。
δ ( z ) = 1 1 + e − z \delta(z) = \frac{1}{1+e^{-z}} δ(z)=1+e−z1
因此,我们可以使用 s i g m o i d sigmoid sigmoid 函数将线性回归的结果映射到范围 [ 0 , 1 ] [0,1] [0,1]。
h θ ( x ) = δ ( θ T x ) = 1 1 + e − θ T x h_{\theta}(\mathbf{x}) =\delta(\mathbf{\theta^{T}x}) = \frac{1}{ 1+e^{-\mathbf{\theta^{T}x}} } hθ(x)=δ(θTx)=1+e−θTx1 -
求解目标
为检验映射函数判别结果的有效性,我们需要使用代价函数 J ( θ ) J(\theta) J(θ) 来衡量
J ( θ ) = 1 2 m ∑ i = 0 m ( h θ ( x ( i ) ) − y ( i ) ) 2 = 1 2 m ( h θ ( x ) − y ) 2 J(\theta) = \frac{1}{2m}\sum_{i=0}^{m}(h_{\theta}(x^{(i)})-y^{(i)})^{2} =\frac{1}{2m}(h_{\theta}(\mathbf{x})-\mathbf{y})^{2} J(θ)=2m1i=0∑m(hθ(x(i))−y(i))2=2m1(hθ(x)−y)2
令 h θ ( x ) = θ T x h_{\theta}(\mathbf{x})= \mathbf{\theta^{T}x} hθ(x)=θTx 和 h θ ( x ) = 1 / ( 1 + e − θ T x ) h_{\theta}(\mathbf{x})= 1/ (1+e^{-\mathbf{\theta^{T}x}}) hθ(x)=1/(1+e−θTx),可得代价函数曲线如下,
显然,线性回归映射函数是线性的,其代价函数曲线是凸函数,可使用梯度下降法得到全局最优解,但逻辑回归的映射函数是非线性的,其代价函数曲线是非凸函数,无法使用梯度下降法得到全局最优解。因此,我们需要为逻辑回归寻找一个凸的代价函数。
回到肿瘤识别的二分类问题,本质是给定一个肿瘤大小 x x x,判断它是恶性肿瘤的概率,即后验概率 p ( y = 1 ∣ x ) p(y=1| x) p(y=1∣x),贝叶斯公式可得 p ( y = 1 ∣ x ) = p ( y = 1 , x ) p ( x ) = p ( x ∣ y = 1 ) p ( y = 1 ) p ( x ∣ y = 1 ) p ( y = 1 ) + p ( x ∣ y = 0 ) p ( y = 0 ) = 1 1 + p ( x ∣ y = 0 ) p ( y = 0 ) p ( x ∣ y = 1 ) p ( y = 1 ) p(y=1|x)=\frac{p(y=1, x)}{p(x)} =\frac{p(x|y=1)p(y=1)}{p(x|y=1)p(y=1)+p(x|y=0)p(y=0)} =\frac{1}{1+\frac{p(x|y=0)p(y=0)}{ p(x|y=1)p(y=1) } } p(y=1∣x)=p(x)p(y=1,x)=p(x∣y=1)p(y=1)+p(x∣y=0)p(y=0)p(x∣y=1)p(y=1)=1+p(x∣y=1)p(y=1)p(x∣y=0)p(y=0)1
令 z = ln p ( x ∣ y = 1 ) p ( y = 1 ) p ( x ∣ y = 0 ) p ( y = 0 ) z=\ln \frac{p(x|y=1)p(y=1)}{p(x|y=0)p(y=0)} z=lnp(x∣y=0)p(y=0)p(x∣y=1)p(y=1),则 p ( y = 1 ∣ x ) = 1 1 + e − z = δ ( z ) p(y=1|x) = \frac{1}{1+e^{-z}} =\delta(z) p(y=1∣x)=1+e−z1=δ(z)
因此,我们可以知道使用 s i g m o i d sigmoid sigmoid 函数将回归结果映射到范围 [0,1] 执行分类任务并非偶然,二分类的本质就是 s i g m o i d sigmoid sigmoid 函数。我们将线性回归函数代入,
p ( y = 1 ∣ x ; θ ) = 1 1 + e − θ T x = h θ ( x ) , p ( y = 0 ∣ x ; θ ) = 1 − h θ ( x ) p(y=1|x; \theta) = \frac{1}{1+e^{-\mathbf{\theta^{T}x}}} = h_{\theta}(\mathbf{x}) ,p(y=0|x; \theta) = 1 - h_{\theta}(\mathbf{x}) p(y=1∣x;θ)=1+e−θTx1=hθ(x),p(y=0∣x;θ)=1−hθ(x)
0-1分布的分布函数可将两者统一为 p ( y ∣ x ; θ ) = h θ ( x ) y ( 1 − h θ ( x ) ) 1 − y p(y|x; \theta)=h_{\theta}(\mathbf{x})^{y} (1 - h_{\theta}(\mathbf{x}) )^{1-y} p(y∣x;θ)=hθ(x)y(1−hθ(x))1−y
极大似然估计可以利用已知的样本结果信息,反推最具有可能(最大概率)导致这些样本结果出现的模型参数值。极大似然函数为 L ( θ ) = ∏ i = 1 m p ( y ( i ) ∣ x ( i ) ; θ ) = ∏ i = 1 m ( h θ ( x ( i ) ) ) y ( i ) ( 1 − h θ ( x ( i ) ) ) 1 − y ( i ) L(\theta)=\prod_{i=1}^{m}p(y^{(i)} | x^{(i)}; \theta) =\prod_{i=1}^{m} ( h_{\theta}( \mathbf{x}^{(i)} ) )^{ y^{(i)} } ( 1- h_{\theta}( \mathbf{x}^{(i)} ) )^{1- y^{(i)} } L(θ)=i=1∏mp(y(i)∣x(i);θ)=i=1∏m(hθ(x(i)))y(i)(1−hθ(x(i)))1−y(i)
两边取对数简化运算, l ( θ ) = ln L ( θ ) = ∑ i = 0 m [ y ( i ) ln ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) ln ( 1 − h θ ( x ( i ) ) ) ] l(\theta)=\ln L(\theta) = \sum_{i=0}^{m} [y^{(i)} \ln ( h_{\theta}( \mathbf{x}^{(i)} ) ) + (1- y^{(i)}) \ln ( 1- h_{\theta}( \mathbf{x}^{(i)} ) )] l(θ)=lnL(θ)=i=0∑m[y(i)ln(hθ(x(i)))+(1−y(i))ln(1−hθ(x(i)))]
极大似然估计是尽可能拟合数据的参数,而最小代价函数是模型与数据最小误差的参数,两者含义一致公式相反,所以最小代价函数是 J ( θ ) = − 1 m l ( θ ) = − 1 m ln L ( θ ) = − 1 m ∑ i = 0 m [ y ( i ) ln ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) ln ( 1 − h θ ( x ( i ) ) ) ] J(\theta)=-\frac{1}{m}l(\theta)=-\frac{1}{m}\ln L(\theta) = - \frac{1}{m} \sum_{i=0}^{m} [y^{(i)} \ln ( h_{\theta}( \mathbf{x}^{(i)} ) ) + (1- y^{(i)}) \ln ( 1- h_{\theta}( \mathbf{x}^{(i)} ) )] J(θ)=−m1l(θ)=−m1lnL(θ)=−m1i=0∑m[y(i)ln(hθ(x(i)))+(1−y(i))ln(1−hθ(x(i)))]
J ( θ ) = − 1 m ∑ i = 0 m [ y ( i ) ln ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) ln ( 1 − h θ ( x ( i ) ) ) ] (1) J(\theta)= - \frac{1}{m} \sum_{i=0}^{m} [y^{(i)} \ln ( h_{\theta}( \mathbf{x}^{(i)} ) ) + (1- y^{(i)}) \ln ( 1- h_{\theta}( \mathbf{x}^{(i)} ) )] \tag{1} J(θ)=−m1i=0∑m[y(i)ln(hθ(x(i)))+(1−y(i))ln(1−hθ(x(i)))](1)
J ( θ ) = 1 2 m ∑ i = 0 m ( h θ ( x ( i ) ) − y ( i ) ) 2 (2) J(\theta) = \frac{1}{2m}\sum_{i=0}^{m}(h_{\theta}(x^{(i)})-y^{(i)})^{2} \tag{2} J(θ)=2m1i=0∑m(hθ(x(i))−y(i))2(2)
公式(1) 是 交叉熵损失函数 (cross-entropy loss function),而公式(2)是 平方误差损失函数(square error loss function)。针对分类任务的映射函数,损失函数曲面图像为最左侧图像,右侧为两种损失函数图像沿着某一特定方向的截面。截面生成两条曲线,交叉熵损失函数曲线两侧梯度较大,可以使用梯度下降法很快地找到最优解,而平方误差损失函数曲线两侧平坦,梯度下降法不适用于寻找最优解。因此,不同的映射函数需要不同的损失函数。 -
梯度下降法
s i g m o i d sigmoid sigmoid 函数求导
δ ′ ( x ) = e − x ( 1 + e − x ) 2 = δ ( x ) [ 1 − δ ( x ) ] \delta^{'}(x)=\frac{ e^{-x} }{ (1+e^{-x})^{2} }=\delta(x)[1-\delta(x)] δ′(x)=(1+e−x)2e−x=δ(x)[1−δ(x)]
从而,可得 ln δ ( x ) \ln \delta(x) lnδ(x) 和 ln ( 1 − δ ( x ) ) \ln ( 1-\delta(x) ) ln(1−δ(x)) 导数分别为
[ log δ ( x ) ] ′ = δ ( x ) ′ δ ( x ) = 1 − δ ( x ) , [ log ( 1 − δ ( x ) ) ] ′ = [ 1 − δ ( x ) ] ′ 1 − δ ( x ) = − δ ( x ) [\log \delta(x)]^{'} = \frac{\delta(x)^{'}}{ \delta(x) } = 1-\delta(x), [\log ( 1-\delta(x) )]^{'} = \frac{[1-\delta(x)]^{'}}{ 1-\delta(x) } = -\delta(x) [logδ(x)]′=δ(x)δ(x)′=1−δ(x),[log(1−δ(x))]′=1−δ(x)[1−δ(x)]′=−δ(x)
最小代价函数是凸函数,可使用梯度下降法寻找最优解,同时最小代价函数求导并代入 s i g m o i d sigmoid sigmoid 求导公式 ∂ J ( θ ) ∂ θ j = ∑ i = 0 m ( h θ ( x ( i ) ) − y ( i ) ) ∗ x j ( i ) \frac{ \partial{J(\theta)} }{ \partial{\theta_{j}} } =\sum_{i=0}^{m}(h_{\theta}( \mathbf{x}^{(i)})-y^{(i)})* \mathbf{x}^{(i)}_{j} ∂θj∂J(θ)=i=0∑m(hθ(x(i))−y(i))∗xj(i)
# 梯度下降
weight = np.zeros(X.shape[1]) # 权重矩阵
weight_old = weight
h = sigmoid(X.dot(weight.T)) # 样本的预测类别概率
weight = weight_old - alpha * ((h - y) * X.T).mean(axis=1) # 权值更新
weight_old = weight
样本特征为 ‘mean texture’ 和 ‘mean perimeter’ 时,判别准确率相对较高,大部分恶性肿瘤被识别出来。此外,我们可以试着增加样本特征以自动调参的方式提高识别准确率。
针对某些问题我们需要使用样本交互项,而样本特征数带来的样本交互项数呈指数级增长,所以我们需要寻找相应的算法自动生成样本交互项的值。以汽车识别为例,该问题的特征是图片的每个像素点,一张50*50的图片拥有2500个像素(n=2500),即特征矩阵
x
\mathbf{x}
x 的长度是2500。当物体识别需要二次交互项时,二次交互项的个数时
250
0
2
≈
2500^{2}≈
25002≈ 3百万个,即特征矩阵
x
\mathbf{x}
x 的长度是3百万。针对每一个特征,我们需要计算出相应的值,工程量十分浩大。
3. 神经网络 Neural Network
- 引入问题
辨别一个算法是否是线性分类器主要看它分类时的函数是否为线性函数,反映到图上就是 决策边界(decision boundary) 是否是直线 。
已知逻辑回归二分类概率函数是
p ( y = 1 ∣ x ; θ ) = 1 1 + e − θ T x , p ( y = 0 ∣ x ; θ ) = e − θ T x 1 + e − θ T x p(y=1|x;\theta)= \frac{1}{1+e^{-\mathbf{\theta^{T}x}}} , \space \space p(y=0|x; \theta)=\frac{ e^{-\mathbf{ \theta^{T}x} } }{ 1+e^{-\mathbf{\theta^{T}x}} } p(y=1∣x;θ)=1+e−θTx1, p(y=0∣x;θ)=1+e−θTxe−θTx
决策边界上的样本被划分为正负样本的概率相等,两式子相除化简得到二分类问题的决策边界 θ T x = 0 \mathbf{ \theta^{T} x=0} θTx=0,它是线性函数。逻辑回归的激活函数 s i g m o i d sigmoid sigmoid 是非线性的,但它执行分类任务的映射函数是线性函数,即决策边界是线性函数,所以逻辑回归的本质是一个线性分类器。
二维平面上,线性函数左侧小于函数,右侧大于函数,因此左侧样本划分为负类,右侧样本划分为正类,即线性分类器可以解决“与”问题、“或”问题。同时,“非”问题可以使用线性分类器划分左侧样本为正类,右侧样本为负类。
但对于中间有条“通道”的情况(“异或”问题),一个线性分类器是无论如何无法解决的。如果想把“通道”中间的样本与两侧样本区分,我们需要使用两个线性分类器进行两次二分类划分,第一个分类器下侧是负类,上侧是正类,第二个下侧是正类,上侧是负类。最后,再利用一个分类器将“通道”与其他区域区分开。
神经网络算法领域最初是被对生物神经系统建模这一目标启发。大脑的基本计算单位是神经元(neuron)。人类的神经系统中大约有860亿个神经元,它们被大约1014-1015个突触(synapses)连接起来。下面图表的左边展示了一个生物学的神经元,右边展示了一个常用的数学模型。每个神经元都从它的树突(dendrites)获得输入信号,然后沿着它唯一的轴突(axon)产生输出信号。轴突在末端会逐渐分枝,通过突触和其他神经元的树突相连。
在神经元的计算模型中,沿着轴突传播的信号(比如)将基于突触的突触强度(比如),与其他神经元的树突进行乘法交互(比如)。其观点是,突触的强度(也就是权重),是可学习的且可以控制一个神经元对于另一个神经元的影响强度(还可以控制影响方向:使其兴奋(正权重)或使其抑制(负权重))。在基本模型中,树突将信号传递到细胞体,信号在细胞体中相加。如果最终之和高于某个阈值,那么神经元将会激活,向其轴突输出一个峰值信号。在计算模型中,我们假设峰值信号的准确时间点不重要,是激活信号的频率在交流信息。基于这个速率编码的观点,将神经元的激活率建模为激活函数(activation function) ,它表达了轴突上激活信号的频率。由于历史原因,激活函数常常选择使用sigmoid函数 ,该函数输入实数值(求和后的信号强度),然后将输入值压缩到0-1之间。
神经元跟神经元之间的连接方式有很多种,不同的连接方式就构成了不同的模型结构。下图为 全连接前馈神经网络结构(Fully Connect Feedforward Network),全连接的意思就是对于当前神经元,神经元跟前一层所有的神经元都进行连接,而且不进行跨层连接,同一层的神经元间不进行连接。其中,第一层输入的X={x1,x2,…xN}为输入层(Input Layer),最后一层Layer L为输出层(Output Layer),其余的称作隐藏层(Hidden Layer)。在训练模型之前,我们会初始化模型参数,也就是模型中每个神经元的w和b。在给定输入的X={x1,x2,…xN}后,神经网络的每个神经元都是用 sigmoid 激活函数进行计算,就得到了Y={y1,y2,yM}。这个计算过程称为前向传播。
-
求解目标
该神经网络的激活函数是 s i g m o i d sigmoid sigmoid 函数,所以损失函数为逻辑回归损失函数,寻找最优解的方法是梯度下降法
L ( θ ) = − 1 m [ ∑ i = 1 m y ( i ) ln ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) ln ( 1 − h θ ( x ( i ) ) ) ] L(\theta)= - \frac{1}{m} [\sum_{i=1}^{m} y^{(i)} \ln ( h_{\theta}( \mathbf{x}^{(i)} ) ) + (1- y^{(i)}) \ln ( 1- h_{\theta}( \mathbf{x}^{(i)} ) )] L(θ)=−m1[i=1∑my(i)ln(hθ(x(i)))+(1−y(i))ln(1−hθ(x(i)))] -
梯度下降法
神经网络每一层有多个神经节点,所以我们需要对每个节点使用梯度下降法,一旦神经网络层数很多时,需要计算的参数可能会达到上百万,所以我们需要引入 反向传播(backpropagation) 使得梯度下降更有效率地计算
w ( τ + 1 ) = w ( τ ) − η ∇ L ( w ( τ ) ) w^{(\tau+1)} = w^{(\tau)} - \eta ∇L( w^{(\tau)}) w(τ+1)=w(τ)−η∇L(w(τ))
-
反向传播算法(Back Propagation)
∂z/∂w = inputs[i]
∂C/∂z = neuron['delta']
∂C/∂w = inputs[i] * neuron['delta']
前向传播(Forward pass): 计算所有参数的
∂
z
∂
w
\frac{\partial z}{\partial w}
∂w∂z,结果为权重线的输入值 x。
# Forward propagate input to a network output
def forward_propagate(network, row):
inputs = row
for layer in network:
new_inputs = list()
for neuron in layer:
activation = activate(neuron['weights'], inputs)
neuron['output'] = transfer(activation)
new_inputs.append(neuron['output'])
inputs = new_inputs
return inputs
∂
z
∂
w
=
i
n
p
u
t
s
\frac{\partial z}{\partial w} = inputs
∂w∂z=inputs
反向传播(Backward pass):Compute
∂
C
∂
z
\frac{\partial C }{\partial z}
∂z∂C for all activation function
z
z
z
C
=
1
2
∑
i
=
1
n
(
y
i
−
y
^
i
)
2
,
∂
C
∂
y
i
=
y
i
−
y
^
i
C = \frac{1}{2} \sum_{i=1}^{n}(y_{i}-\hat{y}_{i})^{2},\space \space \frac{\partial C}{\partial y_{i} } = y_{i}-\hat{y}_{i}
C=21i=1∑n(yi−y^i)2, ∂yi∂C=yi−y^i
for i in range(len(layer)):
neuron = layer[i]
errors.append(neuron['output'] - expected[i])
for i in range(len(layer)):
neuron = layer[i]
neuron['delta'] = transfer_derivative(neuron['output']) * errors[i]
for j in range(len(layer)):
error = 0.0
for neuron in network[i + 1]:
error += (neuron['weights'][j] * neuron['delta'])
errors.append(error)
for j in range(len(layer)):
neuron = layer[j]
neuron['delta'] = transfer_derivative(neuron['output']) * errors[j]
文本表示
1. 离散式表示(Discrete Representation)
- 独热编码(One-hot encoding)
分类问题的分类特征常常是离散无序的(如肿瘤的良性/恶性),无法被机器识别,所以我们要特征映射为数字,即特征编码。二分类问题的离散特征大小可以直接使用0/1编码,而多分类问题的离散特征具有一定顺序时可以编码为自然数。
肿瘤特征:[“恶性”,“良性”] = [ 0,1 ]
年龄特征:[“少年”,“青年”,“中年”,“老年”] = [0,1,2,3]
在分类问题中,离散特征之间的欧式距离反映类别的相似性,距离越近表示特征越相似,欧氏距离公式:
d
(
x
,
y
)
=
∣
∣
x
−
y
∣
∣
=
∑
i
=
1
n
(
x
i
−
y
i
)
2
d(\mathbf{x}, \mathbf{y})=||x-y||=\sqrt{\sum_{i=1}^{n}(x_{i}-y_{i})^{2} }
d(x,y)=∣∣x−y∣∣=i=1∑n(xi−yi)2
自然数编码的欧式距离反映相邻特征的更相似,但是特征的顺序是我们随机安排的。因此,我们需要另寻编码方法保证特征距离相同。
工作特征:[“演员”,“厨师”,“公务员”,“工程师”,“律师”] = [ 0,1,2,3,4 ]
d(演 员,厨 师)= 1
d(厨 师,公务员)= 1
d(公务员,工程师)= 1
d(工程师,律 师)= 1
d(演 员,公务员)= 2
d(演 员,工程师)= 3
...
独热编码使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。因为工作特征属性有5个,表示工作特征有5个状态,所以我们使用5位进行表示。
"演员" = [0, 0, 0, 0, 1]
"厨师" = [0, 0, 0, 1, 0]
"公务员" = [0, 0, 1, 0, 0]
"工程师" = [0, 1, 0, 0, 0]
"律师" = [1, 0, 0, 0, 0]
独热编码后,工作特征张成5维的欧几里得空间,每个特征代表空间的一个基向量。基向量的距离均为 2 \sqrt{2} 2,满足特征两两独立的性质。因此,自然语言处理常常对语句使用独热编码并将处理的结果作为输入。下列语句经过处理的结果是一个 5X5 的矩阵:
Bob likes to play basketball
"Bob" = [0, 0, 0, 0, 1]
"likes" = [0, 0, 0, 1, 0]
"to" = [0, 0, 1, 0, 0]
"play" = [0, 1, 0, 0, 0]
"basketball" = [1, 0, 0, 0, 0]
- 词袋模型(Bag of Word, BOW)
Bag-of-words模型是信息检索领域常用的文档表示方法。在信息检索中,BOW模型假定对于一个文档,忽略它的单词顺序和语法、句法等要素,将其仅仅看作是若干个词汇的集合,文档中每个单词的出现都是独立的,不依赖于其它单词是否出现。也就是说,文档中任意一个位置出现的任何单词,都不受该文档语意影响而独立选择的。例如有如下两个文档:
1:Bob likes to play basketball, Jim likes too.
2:Bob also likes to play football games.
基于这两个文本文档,构造一个词典:
dict = {1:"Bob", 2:"like", 3:"to", 4:"play", 5:"basketball", 6:"also", 7:"football", 8:"games", 9:"Jim", 10:"too"}
这个词典一共包含10个不同的单词,利用词典的索引号,上面两个文档每一个都可以用一个10维向量表示(用整数数字0~n(n为正整数)表示某个单词在文档中出现的次数):
1:[1, 2, 1, 1, 1, 0, 0, 0, 1, 1]
2:[1, 1, 1, 1 ,0, 1, 1, 1, 0, 0]
缺点:
当我们的词汇量增大时,对于每句话用到的词最多还是十来个,于是就导致了每句话的矩阵都是稀疏的,严重影响了内存和计算资源。
因为词袋是基于一个个独立的单词的,在一个句子中没有考虑到词与词之间的顺序和联系,所以在部分情况下可能会导致句义表达不准确,比如"你打了我"和"我打了你",虽然意思相反但是通过词袋模型表达都是一样的。
2. 分布式表示(Distributed Representation)
分布式表示(Distributed representation) 概念最早由Hinton在1986年提出,其思想是通过训练,将每个单词映射到一个较短的连续的向量上来,每一维代表词向量空间中的特定一维,进而可以通过普通的线性代数操作来研究单词之间的关系。
基于分布假说得到的表示均可称为分布表示(distributional representation)。
根据建模的不同,主要可以分为三类:基于矩阵的分布表示(高维)、基于聚类的分布表示(高维)、基于神经网络的分布表示(低维)。【图灵将这三种分类分别称作:distributional representation、clustering based word representation、distributed representation】
它们的核心思想也都由两部分组成:一、选择一种方式描述上下文;二、选择一种模型刻画某个词(下文称“目标词”)与其上下文之间的关系。
1.基于矩阵的分布表示(又称分布语义模型)
这类方法需要构建一个“词-上下文”矩阵,从矩阵中获取词的表示。在“词-上下文”矩阵中,每行对应一个词,每列表示一种不同的上下文,矩阵中的每个元素对应相关词和上下文的共现次数。
在这种表示下,矩阵中的一行,就成为了对应词的表示,这种表示描述了该词的上下文的分布。由于分布假说认为上下文相似的词,其语义也相似,因此在这种表示下,两个词的语义相似度可以直接转化为两个向量的空间距离。
该方法分为三个步骤:
一、选取上下文。第一种:将词所在的文档作为上下文,形成“词-文档”矩阵。第二种:将词附近上下文中的各个词(如上下文窗口中的5个词)作为上下文,形成“词-词”矩阵。第三种:将词附近上下文各词组成的n-gram作为上下文,形成“词-n元词组”。
二、确定矩阵中各元素的值。根据“词-上下文”共现矩阵的定义,里面各元素的值应为词与对应的上下文的共现次数。但一般采用多种加权和平滑方法,eg:tf-idf。
三、矩阵分解。常见分解技术:奇异值分解SVD、非负矩阵分解NMF、主成分分析PCA。
最新代表作:Global Vector模型(GloVe)
2.基于聚类的分布表示
该方法以根据两个词的公共类别判断这两个词的语义相似度。最经典的方法是布朗聚类(Brown clustering)。
3.基于神经网络的分布表示(词向量)
基于神经网络的分布表示一般称作 词向量、 词嵌入(word embedding)、分布式表示(distributed representation)。
-
统计语言模型
-
神经网络语言模型(NNLM)
-
词向量(Word2Vec)
词嵌入 Word Embedding
1. Word2Vec
当一个单词w出现在文本当中,它的上下文是出现在器附近的一组单词(固定大小窗口内),使用w的许多上下文来构建w的表示。例如,单词“banking”含义由窗口大小为5的其他单词共同表达。
b
a
n
k
i
n
g
=
[
0.286
0.792
−
0.177
−
0.107
0.109
−
0.542
0.349
0.271
]
banking = \begin{bmatrix} 0.286 \\0.792 \\ -0.177 \\ -0.107 \\ 0.109 \\ -0.542 \\ 0.349 \\ 0.271 \end{bmatrix}
banking=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡0.2860.792−0.177−0.1070.109−0.5420.3490.271⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
构建词向量:
- 我们由大量的文本(corpus)
- 固定词汇表中的每个单词都由一个向量(vector)表示
- 遍历文本中的每个位置 t t t,每个位置由一个中心词 c c c 和上下文单词 o o o
- 凭借 c c c 和 o o o 的词向量相似性,计算给定中心词 c c c 的上下文 o o o 的概率
- 不断调整词向量最大化此概率
给定中心词求上下文的似然(可能性)函数,
θ
\theta
θ 表示需要优化的变量,
w
t
w_{t}
wt 和
w
t
+
j
w_{t+j}
wt+j 为为中心词和上下文单词,
m
m
m 表示窗口大小:
L
(
θ
)
=
∏
t
=
1
T
∏
−
m
≤
j
≤
m
P
(
w
t
+
j
∣
w
t
;
θ
)
L(\theta) = \prod_{t=1}^{T} \prod_{-m \leq j \leq m} P(w_{t+j} | w_{t}; \theta)
L(θ)=t=1∏T−m≤j≤m∏P(wt+j∣wt;θ)
目标函数
J
(
θ
)
J(\theta)
J(θ) 是平均负对数似然,最小化平均负对数似然相当于最大化似然函数:
J
(
θ
)
=
−
1
T
log
L
(
θ
)
=
−
1
T
∑
t
=
1
T
∑
−
m
≤
j
≤
m
log
P
(
w
t
+
j
∣
w
t
;
θ
)
J(\theta)=-\frac{1}{T} \log L(\theta) = -\frac{1}{T} \sum_{t=1}^{T} \sum_{-m \leq j \leq m} \log P(w_{t+j} | w_{t}; \theta)
J(θ)=−T1logL(θ)=−T1t=1∑T−m≤j≤m∑logP(wt+j∣wt;θ)
Why two vectors?
Easier optimization. Average both at the end.
Two models:
- Skip-grams (SG): Predict context/outside words (position independent) given center word (used in the above example)
- Continuous Bag of Words (CBOW): Predict center word from (bag of) context words
Additional efficiency in training:
Negative sampling (the above focus on softmax)
词向量(word2vec) 基于预测的方法,两部分构成 skip gram 和 Continuous Bag of Words(CBOW)。Skip-gram模型 基于给定语境预测中心词,而CBOW基于中心词预测上下文。
- SKip-gram 模型
中心词为
w
(
t
)
w(t)
w(t),窗口大小为2,通过 skip-gram 模型可以预测上下文单词
w
(
t
−
2
)
,
w
(
t
−
1
)
,
w
(
t
+
1
)
w(t-2),w(t-1),w(t+1)
w(t−2),w(t−1),w(t+1) 和
w
(
t
+
2
)
w(t+2)
w(t+2)。以中心词 sat 为例,窗口大小为 2 时可预测上下文单词为 The, cat, on 和 mat。
执行过程:
- 独热编码将单词转换为向量,语料库单词的数量为 V,因此向量 w e \mathbf{w_e} we 的维度是 V x 1;预测窗口大小决定预测单词的数量 d,所以输入层的权重矩阵 W 是 d x V的矩阵
- 单词向量V通过神经网络传递到隐藏层生成 d x 1 维的向量 V c V_c Vc
- 隐藏层的权重矩阵需要将接收的d x 1 维的向量映射回为 V x 1 的单词,所以隐藏层的权重矩阵W’ 维度为 V x d;因为需要预测 d 个单词,所以需要 d 个权重矩阵
- 隐藏层不使用激活函数,向量 V c V_c Vc 通过神经网络生成 d 个向量 u x v c \mathbf{u_{x}} \mathbf{v_{c}} uxvc
- softmax函数计算得出每个向量的概率 P ( x ∣ c o n t e x t ) P(x|context) P(x∣context)
- 概率最大的那个单词就是最终结果。如果在指定上下文位置中预测的单词是错误的,我们会使用反向传播算法来修正权重向量W和W’。
概率函数:每个词 w w w 都有一个输 入向量 u w \mathbf{u}_{w} uw 和输出向量 v w \mathbf{v}_{w} vw。给定词 w j w_{j} wj,正确预测词 w i w_{i} wi 的概率定义为 p ( w i ∣ w j ) = e u w i T v w j ∑ l = 1 V e u w l T v w j p(w_{i} | w_{j} ) = \frac{e^{\mathbf{u}_{w_{i} }^{T}\mathbf{v}_{w_{j} } }}{\sum_{l=1}^{V} e^{\mathbf{u}_{w_{l} }^{T}\mathbf{v}_{w_{j} } }} p(wi∣wj)=∑l=1VeuwlTvwjeuwiTvwj
损失函数:给定词序列
w
1
,
w
2
,
.
.
.
,
w
T
w_{1}, w_{2}, ..., w_{T}
w1,w2,...,wT,窗口大小为
d
d
d,Sikp-gram 模型需要最小化损失函数
L
=
−
−
1
T
∑
t
=
1
T
log
p
(
w
t
−
d
,
.
.
.
,
w
t
+
d
∣
w
t
)
=
−
1
T
∑
t
=
1
T
∑
j
=
−
d
d
log
p
(
w
t
+
j
∣
w
t
)
L=-- \frac{1}{T}\sum_{t=1}^{T} \log p(w_{t-d},...,w_{t+d}|w_{t}) =- \frac{1}{T}\sum_{t=1}^{T}\sum_{j=-d}^{d}\log p(w_{t+j}|w_{t})
L=−−T1t=1∑Tlogp(wt−d,...,wt+d∣wt)=−T1t=1∑Tj=−d∑dlogp(wt+j∣wt)
- CBOW(Continuous Bag-of-Word) 模型
- 输入中间词前后共C个词,预测中间词,在这个过程中训练出我们需要的词向量矩阵。
- [ x 1 k , . . . , x C k ] [x_{1k},...,x_{Ck}] [x1k,...,xCk] 表示第 k 个中心词的前后C个上下文的 one-hot 向量
- 将查表得到的上下文向量直接进行求和,再通过一个N×V的矩阵映射到输出层
2. Glove
参考文献
[1] 吴恩达机器学习系列课程
[2] 李宏毅2020机器学习深度学习(完整版)国语
[3]《机器学习》周志华
[4] 逻辑回归(logistic regression)的本质——极大似然估计
[5] 1.什么是LR回归?LR的公式及求导?为什么sigmoid函数可以作为概率?
[6] Poll的笔记:[Machine Learning & Algorithm] 神经网络基础
[7] Topics in Backpropagation
[8] A Step by Step Backpropagation Example
[9] 【NLP学习笔记】One-hot encoding:独热编码
[10] Speech and Language Processing. Daniel Jurafsky & James H. Martin, 3rd. Chapter 4
[11] 【双语字幕】斯坦福CS224n《深度学习自然语言处理》课程(2019) by Chris Manning
[10] Efficient Estimation of Word Representations in Vector Spacer
[11] word2vec 中的数学原理详解
[12] Word2Vec Explained Bo Yan