NLP學習-Task1:簡介和詞向量Word Vectors

NLP學習

更新流程↓
Task 1: 簡介和詞矢量Word Vectors
Task 2: 詞矢量和詞義Word Senses
Task 3: 子詞模型Subword Models
Task 4: Contextual詞嵌入
Task 5: 大作業

哈哈哈
當外地小夥轉學到四川學校
陰陽怪氣第一人


簡介和Word Vectors





1. 簡介Introduction


 1.1. 語言學到自然語言處理簡要介紹

  人類比猩猩更加聰明,是因爲人們可以通過語言進行交互,對語言的理解和思考,展現了人類語言的複雜和高效。
  每個人對於語言都可以有自己的理解,因此語言不光具有信息傳遞的功能,還可以通過語言來影響其他人。
  當今社會,網絡速度不斷更新迭代,5G已經油然而生,相對於人類語言,我們使用NLP技術可以高速學習構建更強大的處理能力。
  NLP就是對各種文本內容進行處理。


 1.2. 人類語言和單詞含義

  Q1: How do we represent the meaning of a word?

  定義含義:

  • 用單詞、詞組表示概念
  • 人們運用單詞、符號表示自己的觀點
  • 通過寫作作品、藝術來表達觀
  • 理解含義最普遍的語言方式 (denotational semantics用語言符號對語義進行轉化):signifier(symbol)⇔signified(idea or thing)

  Q2: How do we have usable meaning in a computer?

  通常的解決方案:WordNet,Wordnet是一個包含同義詞集上位詞(用 “is a”來表示關係的詞集列表)的巨大詞典。
etc


  Q3: Problems with resources like WordNet

  WordNet的劣勢:

  • 是很好的resources,但忽略了細微的一些差別,例:proficientgood在詞典中被認爲是同義詞,但事實上這隻在某些文本上下文中成立。
  • 忽略了一些單詞的含義(即含義不完整)
  • 偏主觀(缺少客觀性)
  • 需要人類來不斷地更新和改寫
  • 無法計算單詞之間的相似度



2. 詞表示模型

  詞向量Word Vectors,將單詞編碼成向量,將其表示成在詞空間中的某一點。每一維都可看作是某些語義信息的編碼。

  在NLP中有三種方法將詞表示在計算機中:離散表示one-hot representation分佈表示distributional representation分佈式表示distribution representation

  • Distribution:分佈式描述的是若干元素的連續表示形式,如稠密的詞嵌入向量表示、Word2vec,與之相反的是獨熱向量。
  • Distributional:使用詞語的上下文來表示其語義,基於計數的詞向量表示就是分佈表示,因爲我們都使用詞語的上下文來表徵它的含義。

 2.1. 離散表示one-hot representation

  傳統的基於規則或基於統計的自然語義處理方法將單詞看作一個原子符號,被稱作離散表示one-hot representation
  離散表示把每個詞表示爲一個長向量。這個向量的維度是詞表大小,向量中只有一個維度的值爲1,其餘維度爲0,這個維度就代表了當前的詞。

# e.g.
motel = [0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]
hotel = [0 0 0 0 0 0 0 1 0 0 0 0 0 0 0]

  離散表示相當於給每個詞分配一個id,這就導致這種表示方式不能展示詞與詞之間的關係。另外,離散表示將會導致特徵空間非常大,但也帶來一個好處,就是在高維空間中,很多應用任務線性可分。


 2.2. 分佈表示distributional representation

  分佈表示distributional representation:是基於分佈假設理論,利用共生矩陣來獲取詞的語義表示,可以看成是一類獲取詞表示的方法。

  什麼是分佈假說呢?詞是承載語義的最基本的單元,而傳統的獨熱表示僅僅將詞符號化,不包含任何語義信息。如何將語義融入到詞表示中?Harris 在 1954 年提出的分佈假說(distributional hypothesis)爲這一設想提供了理論基礎:上下文相似的詞,其語義也相似。

  “這裏的分佈”與中文“統計分佈”一詞語義對應,描述的是上下文的概率分佈。用上下文描述語義的表示方法(或基於分佈假說的方法)都可以稱作分佈表示,如潛在語義分析模型(Latent Semantic Analysis, LSA)、潛在狄利克雷分配模型(Latent Dirichlet Allocation,LDA)等。


 2.3. 分佈式表示distribution representation

  分佈式表示distribution representation包括基於矩陣基於聚類基於神經網絡的方式,一般將基於神經網絡的分佈式表示稱爲詞嵌入word embedding。而詞嵌入又包括很多不同的算法集合,或者叫做實現工具,比如SEENAFastText、word2vec等。

分佈式表示優點:

  • 詞之間存在相似關係: 是詞之間存在“距離”概念,這對很多自然語言處理的任務非常有幫助。
  • 包含更多信息: 詞向量能夠包含更多信息,並且每一維都有特定的含義。在採用one-hot特徵時,可以對特徵向量進行刪減,詞向量則不能。

  2.3.1. 詞嵌入word embedding

  詞嵌入word embedding,又叫Word嵌入式自然語言處理(NLP)中的一組語言建模和特徵學習技術的統稱,其中來自詞彙表的單詞或短語被映射到實數的向量。 從概念上講,它涉及從每個單詞一維的空間到具有更低維度的連續向量空間的數學嵌入。
  生成這種映射的方法包括神經網絡,單詞共生矩陣的降維,概率模型,可解釋的知識庫方法,和術語的顯式表示單詞出現的背景。
  當用作底層輸入表示時,單詞和短語嵌入已經被證明可以提高NLP任務的性能,例如語法分析和情感分析。

  詞嵌入技術是將詞轉化成爲稠密向量,並且對於相似的詞,其對應的詞嵌入也相近。
在這裏插入圖片描述




3. Word2vec語言模型的簡要介紹

  如果用一句比較簡單的話來總結,word2vec是用一個一層的神經網絡(即CBOW)把one-hot形式的稀疏詞向量映射稱爲一個n維(n一般爲幾百)的稠密向量的過程。爲了加快模型訓練速度,其中的tricks包括Hierarchical softmax,negative sampling, Huffman Tree等。

  在NLP中,最細粒度的對象是詞語。如果我們要進行詞性標註,用一般的思路,我們可以有一系列的樣本數據(x,y)。其中x表示詞語,y表示詞性。而我們要做的,就是找到一個x -> y的映射關係,傳統的方法包括Bayes,SVM等算法。但是我們的數學模型,一般都是數值型的輸入。但是NLP中的詞語,是人類的抽象總結,是符號形式的(比如中文、英文、拉丁文等等),所以需要把他們轉換成數值形式,或者說通過詞嵌入的方式將它嵌入到一個數學空間裏,而Word2vec就是詞嵌入的一種。

  在NLP中,把x看做一個句子裏的一個詞語,y 是這個詞語的上下文詞語,那麼這裏的f,便是NLP中經常出現的語言模型(language model),這個模型的目的,就是判斷 (x,y) 這個樣本,是否符合自然語言的法則,更通俗點說就是:詞語x和詞語y放在一起。

  Word2vec正是來源於這個思想,但它的最終目的,不是要把 f 訓練得多麼完美,而是隻關心模型訓練完後的副產物——模型參數(這裏特指神經網絡的權重),並將這些參數,作爲輸入 x 的某種向量化的表示,這個向量便叫做——詞向量。

Word2vec的特點

  • 包含大量的文本語料
  • 固定詞表中的每一個單詞由一個詞向量表示
  • 遍歷本文中的每個位置tt,包含了center word中心詞cc,和context words上下文oo(除了cc的外部單詞)。
  • 通過ccoo的詞向量相似性來計算P(o/c)P(o/c)
  • 調整優化word vectors來最小化似然,最大化概率

在這裏插入圖片描述
在這裏插入圖片描述

Word2vec的目標函數:

  對於每一個文本的位置t=1,2,...,Tt = 1,2,...,T,預測窗口爲mm的上下文,給出中心詞wjw_{j}:

likelihood=L(θ)=t=1Tmjm     j0p(wt+jwt;θ) likelihood=L(\theta)=\prod_{t=1}^{T}\prod_{-m \le j \le m\ \ \ \ \ j\ne0}^{}p(w_{t+j}|w_t;\theta)

  注:θ\theta 是需要優化的參數

Jθ=1TlogL(θ)=1Tt=1Tmjm     j0logP(wt+jwt;θ) J(\theta)=-\frac 1TlogL(\theta)=-\frac1T\sum_{t=1}^T\sum_{-m\le j\le m \ \ \ \ \ j\ne 0}logP(w_{t+j}|w_t;\theta)

  1. 損失函數J(θ)J(\theta)是(平均)負的對數似然(negative log likelihood);
  2. 負號將極大化損失函數轉化爲極小化損失函數;
  3. log函數方便將乘法轉化爲求和(優化處理)



  Q:如何計算P(wt+jwt;θ)P(w_{t+j}|w_t;\theta)?

  A:對於每個單詞 w 我們使用兩個向量vwv_w(當ww是中心詞時)和 uwu_w(當ww是上下文單詞時),對於中心詞cc和上下文單詞oo,有: P(oc)=exp(uoTvc)wϵVexp(uwTvc) P(o|c)=\frac {exp(u_o^Tv_c)}{\sum_{w\epsilon V}exp(u_w^Tv_c)}

在這裏插入圖片描述

  在概率函數中:P(oc)=exp(uoTvc)wϵVexp(uwTvc)P(o|c)=\frac {exp(u_o^Tv_c)}{\sum_{w\epsilon V}exp(u_w^Tv_c)}

  • 分子取冪函數使得始終可以爲正
  • 向量 uou_o 和向量 vcv_c 點乘,點乘結果越大,向量之間越相似
  • uTv=uv=i=1nuiviu^Tv=u·v=\sum_{i=1}^nu_iv_i
  • 對整個詞表標準化,給出概率分佈

softmax函數進行歸一化(深度學習中常用): RnRn\Bbb{R^n}\to \Bbb{R^n} softmax(x)=exp(xi)j=1nexp(xj)=pi softmax(x)= \frac {exp(x_i)}{\sum_{j=1}^nexp(x_j)}=p_i 注:用於將任意值 xix_i 映射到概率分佈 pip_i



 3.1.Word2vec目標函數梯度

  通過優化參數的方式訓練模型——最小化損失
在這裏插入圖片描述

  訓練模型:計算所有矢量漸變
  整個模型裏只有一個參數 θ\theta ,所以我們只用優化這一個參數就行。

  例如:模型在一個dd維,詞典大小爲VV:
θ=[vaardvarkva...vzebrauaardvarkua...uzebra]R2dV\theta =\begin{bmatrix}v_{aardvark}\\ v_{a}\\...\\ v_{zebra}\\ u_{aardvark}\\ u_{a} \\ ...\\ u_{zebra}\end{bmatrix}\in \Bbb R^{2dV}

  • 2:每個單詞有兩個向量
  • 通過梯度(導數)下降的方式優化參數
  • 梯度下降會用到鏈式法則
  • 迭代計算每個中心詞向量和上下文詞向量隨着滑動窗口移動的梯度
  • 依次迭代更新窗口中所有的參數

e.g.
在這裏插入圖片描述

 3.2. 優化基礎知識

  3.2.1. 梯度下降

  • 我們的損失函數 J(θ)J(\theta) 需要最小化
  • 使用的方法爲:梯度下降
  • 對於當前 θ\theta ,計算 J(θ)J(\theta) 的梯度
  • 然後小步重複朝着負梯度方向更新方程裏的參數 α=(step size) or (learning rate)\alpha=(step\ size)\ or\ (learning\ rate)θnew=θoldαθJ(θ)\theta^{new}=\theta^{old}-\alpha \nabla_\theta J(\theta)
  • 更新唯一的參數 θ\theta: θjnew=θjoldααα θjoldJ(θ)\theta_j^{new}=\theta_j^{old}-\alpha \frac \alpha{\alpha\ \theta_j^{old}}J(\theta)
while True:
	theta_grad = evaluate_gradient(J,corpus,theta)
  theta = theta - alpha * theta_grad

  3.2.2. SGD隨機梯度下降

  • 由於J(θ)J(\theta)是在語料文本中所有窗口的方程
  • 當語料很大的時候,計算梯度會消耗巨大
  • 解決辦法:SGD隨機梯度下降
  • 不斷sample窗口,不斷更新
while True:
  window = sample_window(corpus)
  theta_grad = evaluate_gradient(J,window,theta)
  theta = tehta - alpha * theta_grad



4. 參考鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章