Skip-gram & CBOW 的一些理解

文章目录

  • Skip-gram & CBOW 的一些理解
    • 〇、前言
    • 一、背景
    • 二、基础结构
      • 2.1 One-hot投影成隐向量
      • 2.2 利用一个词预测一个词
      • 2.3 损失函数的计算
    • 三、CBOW
    • 四、Skip-gram
    • 五、一些训练时用到的tricks
      • 5.1 HierarchicalSoftmaxHierarchical\ SoftmaxHierarchical Softmax
      • 5.2 NegativeSamplingNegative\ SamplingNegative Sampling
    • 六、文中的一些细节
      • 6.1 对学习到的结构和语义上联系的实验
      • 6.2 对短语的学习
      • 6.3 学习到的向量的联系
      • 6.4 一些结果的讨论
        • 6.4.1 HierarchicalSoftmaxHierarchical\ SoftmaxHierarchical Softmax和NegativeSamplingNegative\ SamplingNegative Sampling的对比
        • 6.4.2 CBOW和Skip-gram的对比
    • 七、一些我的想法
      • 7.1 关于多义词
      • 7.2 关于社会计算
    • 八、引用

〇、前言

如果要列举近些年来的机器学习的突破进展,Skip-gram的提出一定在近20年里能排到前20。在近两年的文章中,依然可以看到它的各种变种在各种领域的应用。因此就想去深入的了解一下这个算法,根据[4]的推荐,我读了三篇文章,它们分别是:

1.EfficientEstimationofWordRepresentationsinVectorSpace,ICLR20131.\ Efficient\ Estimation\ of\ Word\ Representations\ in\ Vector\ Space\ , ICLR \ 20131. Efficient Estimation of Word Representations in Vector Space ,ICLR 2013[1], 这一篇是提出Skip-gram的文章。

2.DistributedRepresentationsofWordsandPhrasesandtheirCompositionality,NIPS20132.\ Distributed\ Representations\ of\ Words\ and\ Phrases\ and\ their\ Compositionality,\ NIPS\ 20132. Distributed Representations of Words and Phrases and their Compositionality, NIPS 2013[2], 这一篇是Skip-gram作者为了解释原文中没有详细解释的一些tricks。

3.word2vecParameterLearningExplained,DBLP20163.\ word2vec\ Parameter\ Learning\ Explained\ ,DBLP\ 20163. word2vec Parameter Learning Explained ,DBLP 2016[3], 这篇文章是另外一个人较为详细的解释了Skip-gram和CBOW中的一些细节,对于理解Skip-gram 和 CBOW我觉得非常有用。

后面的段落会简单写一些我对这三篇文章的理解,而非简单的翻译

本文在完成前仅参考了[4]进行相关文章的调研,没有读其他的中文博客,对同一个单词,可能会有一些表达上的差异,敬请谅解。

一、背景

我感觉自然语言处理领域,非常重要的一个内容就是学习到基础单元的表征,而且这种表征往往需要融合进上下文的信息。比如在做文本翻译时,学习到一个单词或者短语的表征对于文本翻译非常重要,而往往要通过一个词在一段话中的位置来进行学习;在做商品推荐时,学习到一个商品或者一筐商品的表征也非常重要,而往往需要通过一个购买者的多次购买行为进行学习;甚至在图上,由于Random Walk出的序列在一定意义上也具有语义上的信息,可以拿Random Walk出的结果进行学习,得到每个点的表征。

但是传统的机器学习做法主要有以下的问题:

  1. 计算开销过大,训练一次花费时间和资源过多,导致训练难度极大
  2. 很难同时学到 语言的结构 syntactic语义semantic上的关系。如[1]中提到RNN能很好的学习到结构上的关系,但是较难学习到语义上的关系。

因此呢,在我看来,为了解决这两个问题,作者提出了CBOWSkip-gram两个模型。

二、基础结构

简单来说CBOW是以多预测一,Skip-gram是以一预测多,为了便于理解,结合了[3]文章的一些思路,我觉得可以通过先构建一个简化的CBOW和与Skip-gram即一个一预测一的模型,从而理解CBOW和Skip-gram的原始思路。

图一一个简单的一预测一模型图一\ 一个简单的一预测一模型 图一 一个简单的一预测一模型
其实可以把这个一预测一模型再拆成了两个,一个是将one hot编码投影成一个隐向量,另外一个是通过隐向量来进行预测,我也会分为两个部分进行解释。

2.1 One-hot投影成隐向量

图二one−hot编码投影成隐向量图二\ one-hot编码投影成隐向量 图二 one−hot编码投影成隐向量
首先,对每个词肯定只能将它进行one-hot编码,即如果总共有VVV个词,则将每个词编码成一个长度为VVV的向量,其中第iii个位为1,其他位为0。

既然这样,为了学到每个单词的表征,可以将它通过一个全连接层,即乘上一个V×NV \times NV×N的矩阵,这样本来每一个单词是1×V1\times V1×V的one-hot编码,现在变成了了一个1×N1\times N1×N的向量。

这样看起来对于每一个词得到它的向量复杂度O(VN)O(VN)O(VN)的,其实假设要第kkk个向量的表征,由于它只有第kkk位为1,它乘一个V×NV \times NV×N 的矩阵,这样得到的结果其实刚好是这个矩阵的第kkk行,因此可以O(N)O(N)O(N)得到它的表征,记作vkv_kvk​。

指的一提的是NNN一般可选50到600。

2.2 利用一个词预测一个词

图三利用一个词来预测另外一个词图三\ 利用一个词来预测另外一个词 图三 利用一个词来预测另外一个词

由于这里的任务是通过一个词预测一个词(虽然看起来比较没有道理),我们首先需要要得到已知这个词的表征,通过2.1的结构,可以得到这个词的表征vkv_kvk​,也记作h\textbf hh它是一个1×N1\times N1×N的向量 。

得到这个词的表征之后,可以将它通过一个全连接层,即乘上一个N×VN\times VN×V的矩阵W′W'W′,可以得到一个1×V1\times V1×V 的向量 u\textbf uu,我们将它第iii维的意义定义为预测结果是第iii个词的置信,即设W′W'W′的第iii列为vi′\textbf v'_ivi′​,则有vi′h=ui\textbf v'_i\textbf h = u_ivi′​h=ui​,接着用一个softmaxsoftmaxsoftmax进行归一化即可得到第k个词预测出每个词的概率,即
P(第j个词∣第k个词)=yj=exp⁡(uj)∑j′=1Vexp⁡(uj′)P(第j个词|第k个词) = y_j = \frac{\exp(u_j)}{\sum_{j'=1}^V\exp(u_{j'})} P(第j个词∣第k个词)=yj​=∑j′=1V​exp(uj′​)exp(uj​)​

2.3 损失函数的计算

由于我们的目标显然是要最大化P(第k个词应该预测出的词∣第k个词)P(第k个词应该预测出的词|第k个词)P(第k个词应该预测出的词∣第k个词),由于log⁡\loglog函数是单调的,即可最大化log⁡(P(第k个词应该预测出的词∣第k个词))\log(P(第k个词应该预测出的词|第k个词))log(P(第k个词应该预测出的词∣第k个词)),假设第kkk个词应该预测出的词是第ooo个词,即有
log⁡(P(第o个词∣第k个词))=log⁡(exp⁡(uo)∑j′=1Vexp⁡(uj′))=uo−log⁡∑j′=1Vexp⁡(uj′)=−E\log(P(第o个词|第k个词)) = \log(\frac{\exp(u_o)}{\sum_{j'=1}^V\exp(u_{j'})})=\\ u_o - \log\sum_{j'=1}^V\exp(u_{j'}) = -E log(P(第o个词∣第k个词))=log(∑j′=1V​exp(uj′​)exp(uo​)​)=uo​−logj′=1∑V​exp(uj′​)=−E
即目标是最小化E=−uo+log⁡∑j′=1Vexp⁡(uj′)E= -u_o + \log\sum_{j'=1}^V\exp(u_{j'})E=−uo​+log∑j′=1V​exp(uj′​)

由于过程中所有式子都是可导的,因此显然是可以反向传播的,就可以train起来了。

三、CBOW

图四CBOW的结构图四\ CBOW的结构 图四 CBOW的结构
CBOW如上图所示,是通过综合第ttt个时间的上下文信息,来预测第ttt个时间的单词的一种模型,目前依照我的理解,应该没必要有下文,只要是多预测一即可,但是原文写得确实是进行对称的时间区间的预测,因此我觉得这样结果可能会好一些。

对于本文第二部分的基础结构来说,

  1. CBOW对2.1这一部分没有变化;
  2. CBOW对2.2这一部分改为了利用多个词来预测一个词,思路也很简单,假设用CCC个词分别为j1,j2,⋯,jCj_1,j_2,\cdots ,j_Cj1​,j2​,⋯,jC​进行预测,先分别和2.2类似,求得他们的表征vj1,vj2,⋯,vjCv_{j_1},v_{j_2},\cdots ,v_{j_C}vj1​​,vj2​​,⋯,vjC​​则求一个向量h=∑i=1CvjiC\textbf{h} = \frac{\sum_{i=1}^Cv_{j_i}}{C}h=C∑i=1C​vji​​​,接着输入到和2.2相同的输出的全连接层中得到预测结果即可;
  3. CBOW对2.3的这一部分损失函数不变,但是由于变成了多预测一,往回反向传播的式子有一些变化,但不是重点,在此就不赘述了。

四、Skip-gram

图五Skip−gram的结构图五\ Skip-gram的结构 图五 Skip−gram的结构
Skip-gram如上图所示,是通过综合第ttt个时间信息,来预测第ttt个时间的上下文的一种模型,目前依照我的理解,应该没必要有下文,只要是一预测多即可,但是原文写得确实是进行对称的时间区间的预测,因此我觉得这样结果可能会好一些。

这个其实看起来比较没有道理,知道一个词怎么就能知道它的上下文了呢,在此我讲一下我的理解。因为其实一个简单的全连接层不是特别能进行预测工作,我们用Skip-gram主要要做的其实是学习一个词的表征核心任务不在于预测,这里这个预测只是将上下文的信息嵌入到这个词的表征中,仅此而已。

那对于本文第二部分的基础结构来说,

  1. Skip-gram对2.1这一部分没有变化;

  2. Skip-gram对2.2这一部分改为了利用一个词来预测多个词j1,j2,⋯jnj_1,j_2,\cdots\,j_nj1​,j2​,⋯jn​,思路也很简单,先和2.2相同,求得这个词的表征vkv_{k}vk​,接着输入到和2.2相同的输出的全连接层中得到了预测结果uku_kuk​。要注意的是即使要预测的是CCC个词,但是仍然只使用一个全连接层,而非使用CCC个,用得到的一个结果uku_kuk​去算损失函数。

  3. Skip-gram对2.3的这一部分损失函数即改变为了
    E=−log⁡(第j1个词,第j2个词,⋯,第jC个词∣第k个词)=−log⁡(∏i=1Cexp⁡(uji)∑j′=1Vexp⁡(uj′))=−∑j=1Cuji+C∗log⁡∑j′=1Vexp⁡(uj′)E = -\log(第j_1个词,第j_2个词,\cdots,第j_C个词 | 第k个词) = \\ -\log(\prod_{i=1}^C\frac{\exp(u_{j_i})}{\sum_{j'=1}^V\exp(u_{j'})})=\\ -\sum _{j=1}^Cu_{j_i} + C*\log\sum_{j'=1}^V\exp(u_{j'}) E=−log(第j1​个词,第j2​个词,⋯,第jC​个词∣第k个词)=−log(i=1∏C​∑j′=1V​exp(uj′​)exp(uji​​)​)=−j=1∑C​uji​​+C∗logj′=1∑V​exp(uj′​)

五、一些训练时用到的tricks

注意到每次损失函数的计算复杂度都是O(V)O(V)O(V)的,当语料库较大时,复杂度显然是不可接受的,因为跑一个句子里的一个词就要O(V)O(V)O(V),VVV有可能是十万级,百万级的。作者为了解决这个问题,提出了两个办法,一个称为HierarchicalSoftmaxHierarchical\ SoftmaxHierarchical Softmax,另一个则是NegativeSampling(负采样)Negative\ Sampling(负采样)Negative Sampling(负采样)。

5.1 HierarchicalSoftmaxHierarchical\ SoftmaxHierarchical Softmax

图六hierarchicalsoftmax图六\ hierarchical\ softmax 图六 hierarchical softmax
由于无论是多预测一,还是一预测多,求得输入词的表征复杂度都较低,而计算输出为每个词的置信度复杂度为$O(V) ,复杂度较大,而在训练时其实只关心输出为应该输出的词,即,复杂度较大,而在训练时其实只关心输出为应该输出的词,即,复杂度较大,而在训练时其实只关心输出为应该输出的词,即词o$的置信度,因此可以设计一种结构较快的求出 词o词o词o的置信度。

作者设计了一种基于huffmanhuffmanhuffman树的做法,为什么用huffmanhuffmanhuffman树其实也是为了降低复杂度,这样频繁被询问的词所需要查找到的次数较小,但是复杂度上限就是log⁡(V)\log(V)log(V),因此我觉得随便搞个二叉树也行,本身只是为了降低复杂度。

具体做法为

  1. 首先将VVV个词作为了huffmanhuffmanhuffman树的叶子节点,根据huffmanhuffmanhuffman编码的方式进行合并。

  2. 其次定义了一个函数n(i,j)n(i,j)n(i,j),表示从根节点到第iii个词,走出jjj步到达的节点,如图六所示,定义L(i)L(i)L(i)表示根节点到第iii个节点所需要走的步,即n(i,L(i))n(i,L(i))n(i,L(i))就是第iii个词,定义ch(i)ch(i)ch(i)表示第iii个节点的左儿子,定义[⁣[p]⁣][\![p]\!][[p]]表示p为真的话,返回1,否则返回-1。

  3. 接着给除了叶子节点以外的n−1n-1n−1个节点各赋予了一个表征vti′\textbf v'_{t_i}vti​′​

  4. 最后有
    p(第o个词∣已知的词)=∏j=1L(o)σ([⁣[n(o,j+1)=ch(n(o,j))]⁣]⋅vn(o,j)′h)p(第o个词|已知的词) = \prod_{j=1}^{L(o)}\sigma([\![n(o,j+1)=ch(n(o,j))]\!]\cdot \textbf v'_{n(o,j)}\textbf h) p(第o个词∣已知的词)=j=1∏L(o)​σ([[n(o,j+1)=ch(n(o,j))]]⋅vn(o,j)′​h)
    其中h\textbf hh为已知词的表征。这个式子大致的意思即为,从根往下找第ooo个词,如果要走左儿子,则乘σ(vn(o,j)′h)\sigma(\textbf v'_{n(o,j)}\textbf h)σ(vn(o,j)′​h),否则乘σ(−vn(o,j)′h)\sigma(-\textbf v'_{n(o,j)}\textbf h)σ(−vn(o,j)′​h),有容斥的思想在其中。

  5. 损失函数的计算也是基于此的,就不赘述了。

5.2 NegativeSamplingNegative\ SamplingNegative Sampling

相对来说NegativeSamplingNegative\ SamplingNegative Sampling(负采样)是一种更直观的方法,由于正样本往往只有很少的几个,负样本非常多,那就采样一些进行算,最后的损失函数为
log⁡(σ(uo))+∑采样出的wjlog⁡(σ(−uwj))\log(\sigma(u_o))+\sum_{采样出的w_j}\log(\sigma(-u_{w_j})) log(σ(uo​))+采样出的wj​∑​log(σ(−uwj​​))
如何采一个好的样比较讲究,考虑到出现频率较高的单词往往没什么特别大意义,如a,and,thea,and,thea,and,the这些,作者构造了一个分布p(第i个词被采样)=1−tcnt(第i个词))p(第i个词被采样) = 1-\sqrt{\frac{t}{cnt(第i个词)}})p(第i个词被采样)=1−cnt(第i个词)t​​),ttt是手动选的一个置信度,通常为10−510^{-5}10−5,有趣的是p34p^{\frac 3 4}p43​才是最后作者用的分别,他认为34\frac 3 443​ 次方会比较好。

六、文中的一些细节

6.1 对学习到的结构和语义上联系的实验

作者做了一个有趣的实验,来证明它真的学习到了结构和语义上的联系。我觉得这个实验对于理解学习到的结果非常有意义,即通过向量的加减来证明学习到的联系。

举个例子,设V(i)V(i)V(i)表示词iii学习到的向量,那么根据我们的理解V(China)−V(Beijing)+V(Tokyo)=?V(China)-V(Beijing)+V(Tokyo)=?V(China)−V(Beijing)+V(Tokyo)=?,显然答案应该是V(Japan)V(Japan)V(Japan)。作者通过找距离问号向量最近的向量,来看看是不是V(Japan)V(Japan)V(Japan)来验证,发现居然真的是,来证明了它学习到的结果比较优秀。他选取了五组语义上的(如城市关系)以及九组结构上的(如动词和名词),来加以验证,结果如下图。

图七对语义和结构上的学习图七\ 对语义和结构上的学习 图七 对语义和结构上的学习

6.2 对短语的学习

其实我觉得更高级的任务是去学习短语,因为真实的行为和短语的关系甚至可能更大,比如购买商品都是以框为单位,而非以单个商品为单位,在这里呢,作者用了一个较为简单的方法来学习短语,即把短语当成一个词,进行学习。因为短语组合可能比较固定,所以语料库很容易覆盖所有的短语。那么如何判断短语呢,作者用了一种估价函数score(i,j)=cnt(i,j)−δcnt(i)∗cnt(j)score(i,j)=\frac{cnt(i,j)-\delta}{cnt(i)*cnt(j)}score(i,j)=cnt(i)∗cnt(j)cnt(i,j)−δ​,即两个一起出现的次数除以两个各自出现的次数,如果超过一定比例,则认为是短语。这样迭代得构造即可。

6.3 学习到的向量的联系

图八学到短语的联系图八\ 学到短语的联系 图八 学到短语的联系
有趣的加了学习短语之后,去找离它最近的单词和短语,使用Skip-gram,可以得到如图八的结果。这样看来用huffman树huffman树huffman树进行优化结果很好。第一个人是达伽马,航海家;第二个是贝加尔湖,和咸海比较类似;第三个是一个登月的人;第四个是一个海;第五个是象棋大师,对应卡斯帕罗夫也不错。

6.4 一些结果的讨论

6.4.1 HierarchicalSoftmaxHierarchical\ SoftmaxHierarchical Softmax和NegativeSamplingNegative\ SamplingNegative Sampling的对比

图九HierarchicalSoftmax和NegativeSampling的对比图九\ Hierarchical\ Softmax和Negative\ Sampling的对比 图九 Hierarchical Softmax和Negative Sampling的对比

其实总得来说在实验数据上显示的是负采样更好一些

6.4.2 CBOW和Skip-gram的对比

图十CBOW和Skip−gram的对比图十\ CBOW和Skip-gram的对比 图十 CBOW和Skip−gram的对比
在结构上的学习,Skip-gram相对比CBOW差了一些,但是在语义上的结果,Skip-gram有极大的提升。

七、一些我的想法

7.1 关于多义词

我感觉在自然语言处理上,应该会很经常的有多义词的出现。比如就人话里就会有很多多义词,比如苹果可能是一个品牌,也有可能是一个水果;再比如对于一个站点,它在某一层次来说,可能是一个交通枢纽,在某一层次也有可能只是一个普通站点;对于这个的学习,我觉得应该会有很多文章,可惜我还没读到,不过我猜可能可以用attentionattentionattention的做法去学习到,所以我打算下一篇先去读attentionisallyourneedattention\ is\ all\ your\ needattention is all your need。

7.2 关于社会计算

这部分仅在提交给社会计算大作业的版本中有。

由于大一下和大二做了一些关于图上的工作,主要是异质图的表示学习,又了解到社会计算和图的关系非常紧密,就选了社会计算课,希望再了解一些图上的知识,也确实收获了很多。

本课学到的诸如传播模型等,我觉得可以很好的利用在异质图的采样上,采样之后得到一个序列,这里就需要RNN或者本文提到的一些模型进行处理去得到图的表征。

总而言之,相信未来各自算法都是基于图的,图才更能模拟出现实的结构,因此我觉得学社会计算这个课非常有必要,也得到了很多比较前沿的知识,感觉体验非常好。

八、引用

[1] Mikolov T , Chen K , Corrado G , et al. Efficient Estimation of Word Representations in Vector Space[J]. Computer Science, 2013.
[2] Mikolov T , Sutskever I , Kai C , et al. Distributed Representations of Words and Phrases and their Compositionality[J]. Advances in neural information processing systems, 2013, 26.
[3] Rong X . word2vec Parameter Learning Explained[J]. Computer Science, 2014.

[4] https://zhuanlan.zhihu.com/p/39751353

Skip-gram CBOW 的一些理解相关推荐

  1. 《自然语言处理学习之路》02 词向量模型Word2Vec,CBOW,Skip Gram

    本文主要是学习参考莫烦老师的教学,对老师课程的学习,记忆笔记. 原文链接 文章目录 书山有路勤为径,学海无涯苦作舟. 零.吃水不忘挖井人 一.计算机如何实现对于词语的理解 1.1 万物数字化 1.2 ...

  2. Rasa课程、Rasa培训、Rasa面试、Rasa实战系列之Understanding Word Embeddings CBOW and Skip Gram

    Rasa课程.Rasa培训.Rasa面试.Rasa实战系列之Understanding Word Embeddings CBOW and Skip Gram 字嵌入 从第i个字符,第i+1个字符预测第 ...

  3. skip gram和cbow的优缺点

    在cbow方法中,是用周围词预测中心词,从而利用中心词的预测结果情况,使用GradientDesent方法,不断的去调整周围词的向量.当训练完成之后,每个词都会作为中心词,把周围词的词向量进行了调整, ...

  4. 感知机的对偶形式及Gram矩阵的作用理解

    学习李航<统计机器学习>的时候,看到感知机的对偶形式这里不甚理解,其实主要是对其中的系数  更新规则不是很理解.另外,只介绍了 Gram 矩阵,也没有说清楚 Gram 矩阵的作用.经过仔细 ...

  5. 感知机的对偶形式及Gram矩阵的作用理解 通俗易懂

    学习李航<统计机器学习>的时候,看到感知机的对偶形式这里不甚理解,其实主要是对其中的系数  更新规则不是很理解.另外,只介绍了 Gram 矩阵,也没有说清楚 Gram 矩阵的作用.经过仔细 ...

  6. 基于Huffman树的CBOW模型的理解

    上面是从如下地址中截取的内容:https://www.zybuluo.com/Dounm/note/591752#mjx-eqn-eq4 下面说下我对它的理解 还是以"今天  我   和   ...

  7. pytorch笔记: 搭建Skip—gram

    skip-gram 理论部分见:NLP 笔记:Skip-gram_刘文巾的博客-CSDN博客 1 导入库 import numpy as np import torch from torch impo ...

  8. 小白看Word2Vec的正确打开姿势|全部理解和应用

    有个用心的读者最近做了一篇论文,想知道Word2Vec的相关理论和应用方法,作为一个有强迫症的我,去翻查了大量的文献资料,决定从Word2Vec的上下文来温习一下这个NLP的基础以及做相关的知识体系的 ...

  9. [Embeding-2]文本表示学习-词嵌入入门理解

    转载自Scofield Phil: http://www.scofield7419.xyz/2017/09/25/文本表示学习-词嵌入入门理解/ 之前一段时间,在结合深度学习做NLP的时候一直有思考一 ...

最新文章

  1. 避不开的算法,如何吃透?
  2. 网络推广外包——网络推广外包公司为每个线下商城实现“线上梦”!
  3. word List 11
  4. leetcode516. 最长回文子序列(动态规划)
  5. 前端npm install失败
  6. 限制ul显示高度_led显示屏钢结构吊装方案原则及适用条件
  7. OpenShift 4 - DevSecOps Workshop (9) - 向Dev环境部署应用镜像
  8. favicon.ico在ie下面不显示的解决方法
  9. livedata mvvm_Android MVVM LiveData数据绑定
  10. js手机号批量滚动抽奖代码实现
  11. darknet框架_【杂谈】面向新手的深度学习开源框架指导手册与GitHub项目,欢迎加入我们的开源团队...
  12. 初学者C语言输入输出挖坑填补处须知
  13. #转载汉化 用C++写出来的人工智能围棋游戏
  14. jszip压缩文件上传到服务器,AngularJS - 使用JSZip压缩上传的pdf文件
  15. 转载来自朱小厮博客的 一文看懂Kafka消息格式的演变
  16. 怎样才能走进区块链行业?
  17. SpringBoot Whitelabel Error Page 错误
  18. 1905. 统计子岛屿-深度优先遍历图
  19. 【Python实例】Python五分钟码出—女神颜值打分系统(人脸识别)!
  20. 「自控原理」5.1 频率特性及其图示

热门文章

  1. 计算机组成原理——有符号数的原码、反码、补码、移码
  2. Vue 解决 npm run build 打包卡住不动的问题?
  3. 怎样才能画好动漫人物的脸?画好动漫人物的脸有哪些技巧?
  4. python常用的基础库
  5. 完全去中心化的编程模式,不需要服务器,也不需要ip,就像一张漫无目的的网络、四处延伸
  6. 虚拟机管理系统哪个好?虚拟机软件推荐!
  7. Cortex-A75和Cortex-A55架构浅析
  8. 2022年回顾 | 被磨砺,被厚待
  9. IOS App 启动时间优化实战
  10. 浅谈如何理解领域驱动设计