复习概念总结(机器学习\深度学习)
对随时会遇到的基础或者有趣的知识进行存储,看心情就补一些霸
一、基础概念
1、 特征学习
需要利用手动特征工程从原始数据的领域知识建立特征(Stage1),然后再部署相关的机器学习算法的都不是特征学习(Stage2),像SVM、决策树、K邻近算法、随机森林都不是,他们的定位应该是在Stage2部分
特征学习可以被分为两类:监督式特征学习(Supervised Representation Learning)和无监督式特征学习(Unsupervised Representation Learning)。
在监督特征学习中,被标记过的数据被当做特征用来学习。例如神经网络(Neural Networks),多层感知器(Multi-Layer Perception),监督字典学习(Supervised Dictionary Learning)。
在无监督特征学习中,未被标记过的数据被当做特征用来学习。例如无监督字典学习(Unsupervised Dictionary Learning),主成分分析(Principal Component Analysis),独立成分分析(Independent Component Analysis),自动编码(Auto-encoders),矩阵分解(Matrix Factorization) ,各种聚类分析(Clustering)及其变形。
2、 BN 与 Dropout
Batch Normalization(BN),就是在深度神经网络训练过程中使得每一层神经网络的输入保持相近的分布。
对于BN,在训练时,是对每一批的训练数据进行归一化,也即用每一批数据的均值和方差。而在测试时,比如进行一个样本的预测,就并没有batch的概念,因此,这个时候用的均值和方差是全量训练数据的均值和方差,这个可以通过移动平均法求得。
对于BN,当一个模型训练完成之后,它的所有参数都确定了,包括均值和方差,gamma和bata。因为用全量训练集的均值和方差容易过拟合,对于BN,其实就是对每一批数据进行归一化到一个相同的分布,而每一批数据的均值和方差会有一定的差别,而不是用固定的值,这个差别实际上能够增加模型的鲁棒性,也会在一定程度上减少过拟合。因此BN一般要求将训练集完全打乱,并用一个较大的batch值,否则,一个batch的数据无法较好得代表训练集的分布,会影响模型训练的效果。
Dropout是在训练过程中以一定的概率的使神经元失活,即输出为0,以提高模型的泛化能力,减少过拟合。Dropout 在训练时采用,是为了减少神经元对部分上层神经元的依赖,类似将多个不同网络结构的模型集成起来,减少过拟合的风险。而在测试时,应该用整个训练好的模型,因此不需要dropout。
BN和Dropout单独使用都能减少过拟合并加速训练速度,但如果一起使用的话并不会产生1+1>2的效果,相反可能会得到比单独使用更差的效果。
3、 防止过拟合
过拟合的本质是什么呢?无非就是对于非本质特征的噪声过于敏感,把训练样本里的噪声当作了特征,以至于在测试集上的表现非常稀烂。
1.引入正则化(参数范数惩罚)
2.Dropout
3.提前终止训练
4.增加样本量
5.参数绑定与参数共享(比如卷积神经网络)
6.辅助分类节点(auxiliary classifiers)
在Google Inception V1中,采用了辅助分类节点的策略,即将中间某一层的输出用作分类,并按一个较小的权重加到最终的分类结果中,这样相当于做了模型的融合,同时给网络增加了反向传播的梯度信号,提供了额外的正则化的思想.
7.Batch Normalization
L1与L2正则化
L2本质是参数解的2阶范数,以二维为例,L2的最优解就是一个圆;如果你还记得话,loss func的组成是两部分一部分是预测值和真实值之间的error,一部分是正则项,前一部分的解空间可以看作是一个梯度下降的等高线,这样一来,loss func的所有局部解就是每层等高线和这个圆之间的切点,所以说约束了解空间。这也是为啥L2会让解平滑,L1会让解稀疏(因为L1的解是一个四个顶点在坐标轴上的正方形,等高线与它的交点多半落在坐标轴上,意味着某一维会变成零)
4、 梯度下降例题
这个图来自Michael A. Nielsen, “Neural Networks and Deep Learning”, Determination Press, 2015。
其次,根据原文,这个图的纵坐标是该层的梯度向量的模,越大表示学习速率越快,即图上写的speed of learning。
因此,梯度消失导致前面的隐藏层比后面的隐藏层学习得慢,因此,最下面的曲线学习速率最慢,是第一层隐藏层,以此类推。由于反向传播,在梯度消失情况下越接近输入层,其梯度越小;在梯度爆炸的情况下越接近输入层,其梯度越大。
D对应的是第一个隐藏层
梯度下降法分随机梯度下降(每次用一个样本)、小批量梯度下降法(每次用一小批样本算出总损失, 因而反向传播的梯度折中)、全批量梯度下降法则一次性使用全部样本。这三个方法, 对于全体样本的损失函数曲面来说, 梯度指向一个比一个准确. 但是在工程应用中,受到内存/磁盘IO的吞吐性能制约, 若要最小化梯度下降的实际运算时间, 需要在梯度方向准确性和数据传输性能之间取得最好的平衡. 所以, 对于数据过大以至于无法在RAM中同时处理时, RAM每次只能装一个样本, 那么只能选随机梯度下降法。
5、 Attention-based Model
Attention-based Model其实就是一个相似性的度量,当前的输入与目标状态越相似,那么在当前的输入的权重就会越大,说明当前的输出越依赖于当前的输入。严格来说,Attention并算不上是一种新的model,而仅仅是在以往的模型中加入attention的思想,所以Attention-based Model或者Attention Mechanism是比较合理的叫法,而非Attention Model。
6、 关于bagging\boosting\stacking\blending
Bagging:独立的集成多个模型,每个模型有一定的差异,最终综合有差异的模型的结果,获得学习的最终的结果;在一定程度上有着Dropout的功能
Boosting(增强集成学习):集成多个模型,每个模型都在尝试增强(Boosting)整体的效果;
Stacking(堆叠):集成 k 个模型,得到 k 个预测结果,将 k 个预测结果再传给一个新的算法,得到的结果为集成系统最终的预测结果;
Bagging和Boosting的区别:
1)样本选择上:
Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
2)样例权重:
Bagging:使用均匀取样,每个样例的权重相等
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
3)预测函数:
Bagging:所有预测函数的权重相等。
Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
4)并行计算:
Bagging:各个预测函数可以并行生成
Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
5)bagging是减少variance,而boosting是减少bias
blending:
Blending是一种模型融合的方式,第一层通过将训练集出一部分作为holdout set,然后通过剩下的数据生成模型对holdout set 进行预测,第二层,直接对预测结果建模生成第二层的模型,如图所示。Blending是 Netflix获胜者提出来的模型融合方法,更偏向工程类。
7、 关于激活函数
激活函数需要具有哪些属性?
计算简单,非线性,几乎处处可微
8、判别式模型和生成式模型
对于一个X,我们要给出对应的Y
判别式模型:根据训练数据得到分类界,比如SVM得到分界面,计算所属训练集产生的最大条件概率,学习到最优边界,能力有限,只能划分出类别。
生成式模型:一般会对每个类建一个模型,有多少个类别就建立多少个,然后分别计算X与不同模型的联合概率,选出最大的作为分类结果。
9、 标准差计算(较为少见)
10、关于机器学习的模型分类
具体可以参考本位最上面的机器学习分类图
11、核函数
所谓判别式模型,需要把正负样本区分开,那势必会遇到区分不开的情形,这时就要用到核函数了,那所以我认为判别式模型都要用核函数的。
12、贝叶斯网络是先验推后验
https://blog.csdn.net/u010705932/article/details/116206996
13、归一化相关问题
当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛;在梯度下降进行求解时能较快的收敛。
所以,使用梯度下降法求解最优解的模型,归一化就非常重要!knn,logistc回归,gbdt,xgboost,adaboost
还有一些模型是基于距离的,所以量纲对模型影响较大,就需要归一化数据,处理特征之间的权重问题,这样可以提高计算精度。比如,knn,svm,kmeans,k近邻,主成分分析;
神经网络对数据分布本无要求,但归一化可以加快训练数据;
那么不需要归一化处理的模型,决策树,随机森林。他们因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率
14、采样相关
bootstrap :有放回地从总共N个样本中抽样n个样本。
基于bootstrap,有以下常用的机器学习方法
boosting
bagging
random forest(RF, 随机森林)
15、线性分类器
线性分类器三种最优准则:
Fisher 准则 :根据两类样本一般类内密集,类间分离的特点,寻找线性分类器最佳的法线向量方向,使两类样本在该方向上的投影满足类内尽可能密集,类间尽可能分开。这种度量通过类内离散矩阵 Sw和类间离散矩阵 Sb 实现。
感知准则函数 :准则函数以使错分类样本到分界面距离之和最小为原则。
其优点是通过错分类样本提供的信息对分类器函数进行修正,这种准则是人工神经元网络多层感知器的基础。
支持向量机 :基本思想是在两类线性可分条件下,所设计的分类器界面使两类之间的间隔为最大,它的基本出发点是使期望泛化风险尽可能小。
16、排序准则(规则和类)
基于规则的排序方案 :依据规则质量的某种度量对规则进行排序。这种排序方案确保每一个测试记录都是由覆盖它的"最好的"规则来分类。
基于类的排序方案:属于同一个类的规则在规则集R中一起出现。然后,这些规则根据它们所属的类信息一起排序。
二、 损失与优化
1、信息增益
信息熵:
信息增益:
2、 AdaGrad
3、 交叉熵损失sigmoid_cross_entropy
二分类:
多分类:
4、 决策树指标
决策树常用三种指标来确定是否继续划分集合:信息增益、信息增益率,基尼指数。
信息熵:即数据样本的纯度,纯度越高,熵越小。
信息增益:按照某一特征划分数据集后熵的减少量,选择减少量最多的特征进行划分,但是偏好特征取值较多的特征,常见模型ID3。
信息增益率:在信息增益的基础上除以一个固有值(intrinsic value,和取值数目有关),会对取值数目较多的特征有更多惩罚,偏好取值数较少的特征,常见模型C4.5
基尼指数:从样本集D中随机抽取两个样本,其类别标记不一致的概率,因此越小越好
5、 一元线性回归的基本假设
1、随机误差项是一个期望值或平均值为0的随机变量;
2、对于解释变量的所有观测值,随机误差项有相同的方差;
3、随机误差项彼此不相关;
4、解释变量是确定性变量,不是随机变量,与随机误差项彼此之间相互独立;
5、解释变量之间不存在精确的(完全的)线性关系,即解释变量的样本观测值矩阵是满秩矩阵;
6、随机误差项服从正态分布
三、 算法原理
1、 Adaboost
Adaboost与Bagging的区别:
采样方式:Adaboost是错误分类的样本的权重较大实际是每个样本都会使用;Bagging采用有放回的随机采样;
基分类器的权重系数:Adaboost中错误率较低的分类器权重较大;Bagging中采用投票法,所以每个基分类器的权重系数都是一样的。
Bias-variance权衡:Adaboost更加关注bias,即总分类器的拟合能力更好;Bagging更加关注variance,即总分类器对数据扰动的承受能力更强。
2、 ResNet
3、 RNN
中间的W矩阵是共享的
CNN也会发生权重共享
4、LSTM
原理
代码实现(pytorch)
导库
'''
code by Tae Hwan Jung(Jeff Jung) @graykode, modify by wmathor
'''
import torch
import numpy as np
import torch.nn as nn
import torch.optim as optim
import torch.utils.data as Data
dtype = torch.FloatTensor
准备数据
sentence = (
'GitHub Actions makes it easy to automate all your software workflows '
'from continuous integration and delivery to issue triage and more'
)
word2idx = {w: i for i, w in enumerate(list(set(sentence.split())))}
idx2word = {i: w for i, w in enumerate(list(set(sentence.split())))}
n_class = len(word2idx) # classification problem
max_len = len(sentence.split())
n_hidden = 5
一开始看到这个 sentence 不懂这种写法是什么意思,如果你调用 type(sentence) 以及打印 sentence 就会知道,这其实就是个字符串,就是将上下两行字符串连接在一起的一个大字符串
数据预处理,构建dataset,定义dataloader
def make_data(sentence):
input_batch = []
target_batch = []
words = sentence.split()
for i in range(max_len - 1):
input = [word2idx[n] for n in words[:(i + 1)]]
input = input + [0] * (max_len - len(input))
target = word2idx[words[i + 1]]
input_batch.append(np.eye(n_class)[input])
target_batch.append(target)
return torch.Tensor(input_batch), torch.LongTensor(target_batch)
# input_batch: [max_len - 1, max_len, n_class]
input_batch, target_batch = make_data(sentence)
dataset = Data.TensorDataset(input_batch, target_batch)
loader = Data.DataLoader(dataset, 16, True)
这里面的循环还是有点复杂的,尤其是 input 和 input_batch 里面存的东西,很难理解。所以下面我会详细解释
首先开始循环,input 的第一个赋值语句会将第一个词 Github 对应的索引存起来。input 的第二个赋值语句会将剩下的 max_len - len(input) 都用0去填充
第二次循环,input 的第一个赋值语句会将前两个词 Github 和 Actions 对应的索引存起来。input 的第二个赋值语句会将剩下的 max_len - len(input) 都用0去填充
每次循环,input 和 target 中所存的索引转换成word如下图所示,因为我懒得去查看每个词对应的索引是什么,所以干脆直接写出存在其中的词
从上图可以看出,input 的长度永远保持 max_len(=21),并且循环了max_len-1次,所以最终 input_batch 的维度是[max_len - 1, max_len, n_class]
定义网络架构
class BiLSTM(nn.Module):
def __init__(self):
super(BiLSTM, self).__init__()
self.lstm = nn.LSTM(input_size=n_class, hidden_size=n_hidden, bidirectional=True)
# fc
self.fc = nn.Linear(n_hidden * 2, n_class)
def forward(self, X):
# X: [batch_size, max_len, n_class]
batch_size = X.shape[0]
input = X.transpose(0, 1) # input : [max_len, batch_size, n_class]
hidden_state = torch.randn(1*2, batch_size, n_hidden) # [num_layers(=1) * num_directions(=2), batch_size, n_hidden]
cell_state = torch.randn(1*2, batch_size, n_hidden) # [num_layers(=1) * num_directions(=2), batch_size, n_hidden]
outputs, (_, _) = self.lstm(input, (hidden_state, cell_state))
outputs = outputs[-1] # [batch_size, n_hidden * 2]
model = self.fc(outputs) # model : [batch_size, n_class]
return model
model = BiLSTM()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
训练&测试
# Training
for epoch in range(10000):
for x, y in loader:
pred = model(x)
loss = criterion(pred, y)
if (epoch + 1) % 1000 == 0:
print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.6f}'.format(loss))
optimizer.zero_grad()
loss.backward()
optimizer.step()
# Pred
predict = model(input_batch).data.max(1, keepdim=True)[1]
print(sentence)
print([idx2word[n.item()] for n in predict.squeeze()])
5、EM算法
本部分内容转自:https://zhuanlan.zhihu.com/p/64345620
EM算法即最大期望算法(Expectation-Maximization algorithm, EM),是一类通过迭代进行极大似然估计(Maximum Likelihood Estimation, MLE)的优化算法,通常作为牛顿迭代法(Newton-Raphson method)的替代用于对包含隐变量(latent variable)或缺失数据(incomplete-data)的概率模型进行参数估计。
因其迭代规则容易实现并可以灵活考虑隐变量,EM算法被广泛应用于处理数据的缺失值,以及很多机器学习算法,包括高斯混合模型(Gaussian Mixture Model, GMM)和隐马尔可夫模型(Hidden Markov Model, HMM)的参数估计,是机器学习中使用最多的十大算法之一。
EM算法的原理为先根据假设的θ,估计出z;然后根据z利用最大似然函数更新θ,之后循环迭代直至收敛。因此EM算法求解的关键是“根据θ求出z”和“根据z求出θ”,关于后者通过最大化似然函数即可求解,难点主要在于“根据θ求出z”,因此本节主要对该部分的推导与求解过程进行介绍。
首先我们将问题最终转化为下式
但上式是无法直接求解出θ的,为此我们在求解时引入了一些小技巧。虽然我们无法直接最大化该似然函数,但如果能找到似然函数的一个十分贴近的下界并一直优化它,并保证每次迭代能够使总的似然函数一直增大,其实最终效果与最大化原函数几乎等同。
遵循上述思想,我们首先引入一个新的未知的关于z的分布Q(z):
然后根据Jensen不等式,我们将目标函数进行缩放:
通过缩放我们找到了似然函数的一个下界,那么是否通过优化它就行了?不是的,上面说了必须保证这个下界是十分贴近的,也就是至少有点能使等号成立。同样由Jensen不等式,等式成立的条件是随机变量是常数,具体到这里,就是:
又因为Q(z)是z的分布函数,所以:
把上式中的C乘到等式右边,可得
此时我们终于可以求出z的分布函数Q(z):
有了Q(z)我们就能在已知θ值的情况下,估计出每个样本属于东北人还是四川人的概率,进而通过EM算法求解。
以上便是关于EM算法的解析,需要额外说明的是,EM算法在一般情况是收敛的,但是不保证收敛到全局最优,有可能会陷入局部的最优。因为EM算法是机器学习中使用的最多的十大算法之一,因此如何改进EM算法使其能够收敛到全局最优也是一个十分值得研究的方向。
6、word2vec
skip-gram和CBOW 区别
CBOW更适合快速训练,skip-gram适合精确训练。
当样本较小的情况下,选skip-gram更好拟合,CBOW可能训练不充分
优化(哈夫曼树和负采样)
转自NLP笔记之word2vec算法(2)–Hierarchical Softmax原理+数学推导
如果词典的大小V十分庞大的时候,整个分母需要计算中心词和词典中所有词的乘积,这显然是个非常庞大的计算量,因此Wordvec中提出了两种解决方案,一种是基于Hierarchical softmax的解决方案,一种是基于Negative sampling的解决方案。
基于Hierarchical Softmax的模型(哈夫曼树)
为了避免需要计算所有词向量,word2vec采用了hierarchical softmax的方式,简单来说就是采用哈夫曼树(也叫作霍夫曼树)建树的方式来计算softmax,下面会详细介绍如何采用哈夫曼树来进行softmax的计算和建模。
因为我们输出层所要做的是要求出词典的所有词的概率,最后从中选出所需要的词语作为输出。因为我们知道词典的大小为V,所以如下图所示:
我们将叶节点个数设为V,这就对应着我们最后的V个概率值。先前的模型计算概率是在分母部分计算所有词向量的乘积,在哈夫曼树中,我们要计算概率只需要从根节点沿着树往下到叶节点为止即可,这样对于每个叶节点的概率,需要计算的量直接从V 减少到了log2 V,因为这是基于二叉树的性质。
比如对于w2来说,只需要计算从根节点到w2节点之间节点的乘积即可,省去了很多计算量。在这里根节点的值就是输入的向量求和取平均值的那个向量,所有叶子节点对应的就是输出层的V个神经元,叶子节点的个数就是词典的大小V。对应于上面的神经网络图来说,Input layer就是求和取平均值的向量,隐藏层的神经元就是哈夫曼树中所有的内部节点,输出层的神经元就是所有叶子节点。
因为在哈夫曼树中,隐藏层到输出层的softmax映射不是一下子分母求和完成的,而是沿着哈夫曼树一步步向下延伸所求得的,因此这种softmax叫做“Hierarchical softmax” ,也叫层级softmax。
那么如何沿着哈夫曼树来计算概率呢? 在Word2vec中,所采用的是二元逻辑回归的方式,它们规定沿着左子树走,就定义为负类(哈夫曼树的编码为1),沿着右子树走,就定义为正类(哈夫曼树的编码为0)。计算正类和负类所采用的计算方式是sigmoid函数,即
P(-) = 1 - P(+),因为哈夫曼树是二叉树,要么就往左边走,不然就往右边走。
当计算到某一个内部节点时,根据P(+)和P(-)的值的大小来决定是左子树走还是往右子树走,谁大就往哪边走,而控制P(−),P(+)谁的概率值大的因素一个是当前节点的词向量,另一个是当前节点的模型参数。对于上图中的 来说,在训练的过程中,我们当然希望n(,1)的P(-) 更大,n(,2)的P(-) 更大,n(,3)的P(+)更大。所以根据这样的方式,我们就可以对模型进行训练,来得到一些比较好的参数的取值,进而进行模型的预测。
在这里总结一下使用哈夫曼树的优点:
1.由于哈夫曼树是二叉树,所以计算量直接从V 降低到了log2V。
2.由于根据哈夫曼树的性质,靠近树根的节点是更加高频的词汇,离树根较远的节点是出现次数较少的词汇,这样就使得查找高频词汇所需要的花费的路径和时间更少,符合我们贪心优化的思想。
回到模型本身,我们的目标就是希望找到合适的所有节点的词向量和所有内部节点的θ ,来使得训练样本达到最大似然,达到最优的结果,那么具体的数学实现是怎么样的呢?接下来进行讲解。
数学推导:
最大化下面的似然函数:
定义w 经过的哈夫曼树某一个节点 j 的逻辑回归概率为
那么对于某一个目标词 {w} ,它的最大似然为:
在word2vec中,由于使用的是随机梯度上升法,所以并没有把所有样本的似然乘起来得到真正的训练集最大似然,仅仅每次只用一个样本更新梯度,这样做的目的是减少梯度计算量。这样我们可以得到w的对数似然函数 L如下:
要得到模型中 w词向量和内部节点的模型参数θ , 我们使用梯度上升法即可。首先我们求模型参数的梯度:
同样求出xw的梯度表达式
基于Hierarchical Softmax的CBOW模型
第一步我们需要先定义词向量的维度大小M,以及CBOW模型的上下文大小2c,这样对于训练样本中的每一个词,它前面的c个词和后面的c个词作为模型的输入,然后在输出的概率分布中,它自己的概率值期望要最大。
然后我们需要将词汇表建立生成一颗哈夫曼树。
对于从输入层到隐藏层(投影层),我们就直接采用求和取平均值的方式,对2c个词向量进行求和并取平均值
第二步,我们就采用梯度上升的方式来更新θ和Xi
我们总结一下基于Hierarchical Softmax的CBOW模型的算法流程,梯度迭代部分这里采用了随机梯度上升法:
输入 : 基于CBOW的语料训练样本,词向量的维度大小M,CBOW的上下文大小2c,步长μ
输出 :哈夫曼树内部节点模型参数θ,所有的词向量w
1 基于训练样本建立哈夫曼树
2 随机初始化所有的参数θ 和 所有的词向量w
3 进行梯度上升迭代过程, 对于训练样本中的每一个样本(context(w),w )因为输入部分是2c个context,输出是w,所以是(context(w),w),对于每个样本作如下处理:
(1) e = 0, 计算
(2) for j = 2 to ,计算:
(3) 对于context(w) 中的每一个词向量 Xi(共2c个)进行更新:
(4) 如果梯度收敛,则结束迭代,否则返回步骤(3) 继续迭代。
基于Negative Sampling的模型(负采样)
是如何采样到neg个负样本的呢?
在word2vec中,所采用的方式其实比较简单。假设词典的大小为V,那么我们将一个长度为1的线段分成 段, 每段就对应着词典中的一个词。又因为词典中的词出现频率各不相同,因此各段的大小也不相同,高频的词就相对更长一些,低频的词就更短一些。对于每个词w的线段长度定义如下:
在word2vec中,分子和分母都取了3/4次幂如下:
然后再进行采样的时候,我们将这个长度为1的线段分成M等份,M > > V , 这样的做法是可以保证每个词对应的线段都能够被分成若干个部分,而 M 中的每一份都会落在某一个词对应的线段上。
在采样的时候,我们就直接从 M 个位置上采样出 neg 个位置就行了,此时所采样到的每一个位置对应的线段所属的词就是我们的负例词。在word2vec中,M取值默认为 108 。
数学推导:
这里为了统一描述更方便,我们将正例定义为 w0。
在逻辑回归中,我们的正例应该期望满足:
我们的负例应该期望满足:
然后我们期望最大化下面的式子:
我们将上式写成似然函数:
此时对应的对数似然函数为:
和Hierarchical Softmax类似,这里采用的是随机梯度上升法,每次仅仅只用一个样本更新梯度,来迭代更新我们的需要的参数 xwi ,θwi,i = 0,1,2,…neg,这里我们需要求出 xw0 ,θwi ,i = 0,1,2,…,neg 的梯度。
有了梯度表达式,我们就可以利用梯度上升法进行迭代来一步步求解我们需要的 xwi,θwi ,i = 0,1,2,…,neg