java面试编程题算法,Word Embedding(1)

具体例子

在给定第 t t t个位置中心词 b a n k i n g banking banking的情况下,当窗口大小设为 2 2 2时,通过给定 p ( w t ) p(w_t) p(wt​)来计算左右窗口大小为 2 2 2的词的条件概率;

  • 相似度

对于每个位置 t = 1 , 2 , … … , T t=1,2,……,T t=1,2,……,T,当预测固定窗口大小为 m m m的上文问关联词时,给出中心词为 w t w_t wt​,则相似度为:

L ( θ ) = ∏ t = 1 T ∏ − m < = j < = m , j ≠ 0 P ( w t + j ∣ w t ; θ ) , 其 中 θ 是 所 有 需 要 优 化 的 变 量 L(\theta)=\prod ^T_{t=1} \prod _{-m<=j<=m,j\not=0} P(w_{t+j}|w_t;\theta),其中\theta是所有需要优化的变量 L(θ)=t=1∏T​−m<=j<=m,j​=0∏​P(wt+j​∣wt​;θ),其中θ是所有需要优化的变量

  • 目标函数(损失/代价函数)

J ( θ ) = − 1 T l o g L ( θ ) = − 1 T ∑ t = 1 T ∑ − m < = j < = m , j ≠ 0 l o g P ( w t + j ∣ w t ; θ ) J(\theta)=-\frac{1}{T}logL(\theta)=-\frac{1}{T}\sum^T_{t=1}\sum_{-m<=j<=m,j\not=0}logP(w_{t+j}|w_t;\theta) J(θ)=−T1​logL(θ)=−T1​t=1∑T​−m<=j<=m,j​=0∑​logP(wt+j​∣wt​;θ)

即目标函数为负的相似度函数对数的平均值,通过最小化目标函数,从而将预测的准确率最大化;

  • 预测函数

如何最小化目标函数呢?我们可以通过对预测函数的的处理来解决这一问题。对于预测函数 P ( w t + j ∣ w j , θ ) P(w_{t+j}|w_j,\theta) P(wt+j​∣wj​,θ),可以通过用词 w w w的两个向量来解决。我们假设 V w V_w Vw​是中心词, U w U_w Uw​是语境词。则对于中心词 c c c和语境词 o o o而言,存在如下关系:

P ( o ∣ c ) = e x p ( u o T v c ) ∑ w ∈ V e x p ( u w T v c ) P(o|c)=\frac{exp(u^T_ov_c)}{\sum_{w\in V}exp(u^T_wv_c)} P(o∣c)=∑w∈V​exp(uwT​vc​)exp(uoT​vc​)​

其中,分子中 o o o和 v v v的点积 u o T v C u^T_o v_C uoT​vC​越大,则最后得到的概率 P ( o ∣ v ) P(o|v) P(o∣v)越大。而分母则通过指数函数计算之后,从而实现了对整个词表的标准化;

  • 实例

其中 P ( u p r o b l e m s ∣ v i n t o ) P(u_{problems}|v_{into}) P(uproblems​∣vinto​)为 P ( p r o b l e m s ∣ i n t o ; u p r o b l e m s , v i n t o , θ ) P(problems|into;u_{problems},v_{into},\theta) P(problems∣into;uproblems​,vinto​,θ)的简写形式;

  • S o f t m a x Softmax Softmax回归

s o f t m a x ( x ) i = e x p ( x i ) ∑ j = 1 n e x p ( x j ) = p i softmax(x)_i = \frac{exp(x_i)}{\sum^n_{j=1}exp(x_j)}=p_i softmax(x)i​=∑j=1n​exp(xj​)exp(xi​)​=pi​

s o f t m a x softmax softmax又称为多项逻辑回归( m u l t i n o m i a l l o g i s t i c r e g r e s s i o n multinomial logistic regression multinomiallogisticregression),多用于分类过程,它通过将多个神经元的输出,映射到 ( 0 , 1 ) (0,1) (0,1)区间。它通过将任意值 x i x_i xi​映射到一个概率分布 p i p_i pi​上," m a x max max“是因为它会将输入中最大的值的概率进一步放大,而” s o f t soft soft"则是因为对于输入中极小的值,它也人然后分配一些概率,而不是直接丢弃。因此, s o f t m a x softmax softmax函数常常用在深度学习中;

word2vec中将文本进行向量表示的方法


  • C B O W ( C o n t i n u o u s B a g o f W o r d s ) CBOW(Continuous Bag of Words) CBOW(ContinuousBagofWords)

CBOW模型结构图

给定上下文中的词,然后预测中心词。从而利用中心词的预测结果情况,利用梯度下降方法不断调整上下文词的向量。训练完成后,每个词都作为中心词遍历了一遍,将上下文中的词向量进行调整,从而获取整个文本中所有词的向量;

  • S G ( S k i p − G r a m ) SG(Skip-Gram) SG(Skip−Gram)

SG模型结构图

给定中心词,然后预测上下文中的词。从而利用上下文中的词的预测结果情况,利用梯度下降法不断调整中心词的词向量,最后文本遍历完一遍之后,就得到了所有词的词向量;

  • C B O W CBOW CBOW和 S G SG SG的比较

两者均为三层神经网络(输入层、投影层和输出层)。 S G SG SG中,每个词作为中心词时,是一对多的情况,多个上下文中的词对一个中心词进行“训练”,然后得出较准确地中心词的向量结果,这样最终的效果更好。 C B O W CBOW CBOW中,是多对一的情况,多个上下文中的词从一个中心词处进行“学习”,这样效率更高,速度快,但是最终效果却不如 S G SG SG。此外,在 S G SG SG中,每个词都会受上下文词的影响,每个词作为中心词时,需要进行 K K K次训练( K K K为窗口大小),所以经过多次调整将使得词向量相对更准确。 C B O W CBOW CBOW预测词数和整个文本中词数几乎相等,每次预测才会进行一次反向传播。

模型优化的方法


  • 分层 S o f t m a x Softmax Softmax

用于分层softmax的二叉树示例

用于计算 s o f t m a x softmax softmax的方法,用二叉树(根据类标频数构造的霍夫曼树)来表示词汇表中的所有单词。如上图,其中,白色节点表示词汇表中的所有单词,而黑色节点则表示隐节点。其中 V V V个单词存储于二叉树的叶子节点单元,而对于每个叶子节点,都有一条唯一的路径可以从根节点达到该叶子节点,这条路径用于计算该叶子节点所代表的单词的概率。在这个模型中,不存在单词的输出向量,而是 V − 1 V-1 V−1个隐节点中都有一个输出向量 v n ( w , j ) ‘ v ^`_{n(w,j)} vn(w,j)‘​,单词作为输出词的概率被定义为:

p ( w = w O ) = ∏ j = 1 L ( w ) − 1 σ ( [ [ n ( w , j + 1 ) = c h ( n ( w , j ) ) ] ] . v n ( w , j ) ‘ T h ) p(w=w_O)=\prod {L(w)-1}_{j=1}\sigma([[n(w,j+1)=ch(n(w,j))]].{v`_{n(w,j)}}^Th) p(w=wO​)=j=1∏L(w)−1​σ([[n(w,j+1)=ch(n(w,j))]].vn(w,j)‘​Th)

其中, c h ( n ) ch(n) ch(n)是节点 n n n的左侧子节点, v n ( w , j ) ‘ v^`_{n(w,j)} vn(w,j)‘​是隐节点 n ( w , j ) n(w,j) n(w,j)的向量表示(即“输出向量”)。而 h h h则是隐藏层的输出值(SG模型中, h = v w i h=v_{wi} h=vwi​;CBOW模型中, h = 1 C ∑ c = 1 C v w c h=\frac{1}{C}\sum_{c=1}^C v_{w_c} h=C1​∑c=1C​vwc​​), [ [ x ] ] [[x]] [[x]]则为一个特殊函数,其定义如下:

[ [ x ] ] = { 1    , i f   x   i s   t r u e − 1   ,   o t h e r s [[x]]=\begin{cases}1\ \ ,if\ x\ is\ true\\-1\ ,\ others\end{cases} [[x]]={1  ,if x is true−1 , others​

  • 负采样技术

为解决数量过于庞大的输出向量的更新问题,于是在更新时不更新所有向量,而只更新他们的一个样本。正样本应该出现在我们的样本中,此外也需要加入几个单词作为负样本。而在采样的过程中,我们需要任意指定一个总体的概率分布,这个分布就叫做噪声分布,标记为 P n ( w ) P_n(w) Pn​(w)。在 w o r d 2 v e c word2vec word2vec中,作者用一个定义好的后多项分布的负采样形式取代简化的训练目标,从而产生高质量的嵌入:

E = − l o g σ ( v w O ‘ T h ) − ∑ w j ∈ W n e g l o g σ ( − v w j ‘ T h ) E=-log\sigma({v`_{w_O}}Th)-\sum_{w_j\in W_{neg}}log\sigma(-{v`_{w_j}}Th) E=−logσ(vwO​‘​Th)−wj​∈Wneg​∑​logσ(−vwj​‘​Th)

其中, w O w_O wO​是正样本(即输出单词), v w O ‘ v^`_{w_O} vwO​‘​是词向量。而 h h h则是隐藏层的输出值(SG模型中, h = v w i h=v_{wi} h=vwi​;CBOW模型中, h = 1 C ∑ c = 1 C v w c h=\frac{1}{C}\sum_{c=1}^C v_{w_c} h=C1​∑c=1C​vwc​​)。 W n e g = { w j ∣ j = 1 , … , K } W_{neg}=\{w_j|j=1,…,K\} Wneg​={wj​∣j=1,…,K}是从 P n ( w ) P_n(w) Pn​(w)中采样得到的单词集合,即负样本。

G l o v e Glove Glove


  • 定义

基于计数和直接预测的方法;

  • 目标函数

J ( θ ) = 1 2 ∑ i , j = 1 W f ( P i j ) ( u i T v j − l o g P i j ) 2 J(\theta)=\frac{1}{2}\sumW_{i,j=1}f(P_{ij})(uT_iv_j-logP_{ij})^2 J(θ)=21​i,j=1∑W​f(Pij​)(uiT​vj​−logPij​)2

X f i n a l = U + V X_{final}=U+V Xfinal​=U+V

其中, P i j P_{ij} Pij​是单词 j j j出现在单词 i i i上下文中的概率,而 f ( P i j ) f(P_{ij}) f(Pij​)则是为了去除噪声而设定的函数。

如何评价 E m b e d d i n g Embedding Embedding


  • 内在方式:对特定/中间子任务的评估;

  • 外在方式:应用到具体任务中;

f a s t T e x t fastText fastText分类


在文本分类任务中, f a s t T e x t fastText fastText作为一种浅层网络,能取得媲美于深度网络的精度,但是训练时间却比深度网络快许多数量级。一般情况下,用 f a s t T e x t fastText fastText进行文本分类的同时也会产生词的 e m b e d d i n g embedding embedding;

  • 字符级的 n − g r a m n-gram n−gram

w o r d 2 v e c word2vec word2vec中以词作为原子,为每个词生成一个向量,而忽略词内部形态特征。面对这一问题, f a s t T e x t fastText fastText采用字符级的 n − g r a m n-gram n−gram来表示一个单词。通过这样处理则有两个优点;

  1. 对于低频词,生成的词向量效果更好,其 n − g r a m n-gram n−gram可以与其他词共享;

  2. 对于训练词库外的词,仍然可以构建其词向量,可通过叠加其字符级 n − g r a m n-gram n−gram从而生成向量;

  • 模型架构

fastText模型架构图
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?

既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?

架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。

如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。

中高级开发必知必会:

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。

如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。

中高级开发必知必会:

[外链图片转存中…(img-ShAu5L22-1713315518899)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值