1. 程式人生 > >#【中英】【吳恩達課後程式設計作業】Course 5

#【中英】【吳恩達課後程式設計作業】Course 5

【中英】【吳恩達課後程式設計作業】Course 5 - 序列模型 - 第二週作業 - 詞向量的運算與Emoji生成器

資料下載

【博主使用的python版本:3.6.2】

1 - 詞向量運算

  因為詞嵌入的訓練是非常耗資源的,所以大部分人都是選擇載入訓練好的詞嵌入資料。在本部落格中,我們將學習到:

  1. 如何載入訓練好了的詞向量
  2. 使用餘弦相似性計算相似度
  3. 使用詞嵌入來解決“男人與女人相比就像國王與____ 相比”之類的詞語類比問題
  4. 修改詞嵌入以減少性別偏見等 我們先來載入所需要的包:
import numpy as np
import w2v_utils

  接下來就是載入詞向量了,這裡我們使用50維的向量來表示單詞:

words, word_to_vec_map = w2v_utils.read_glove_vecs('data/glove.6B.50d.txt')

  我們載入了以下資料:

  • words:單詞的集合
  • word_to_vec_map : 字典型別,單詞到GloVe向量的對映

  你可以使用下面的語句來看看到底儲存了些什麼:

# python 3.x
print(word_to_vec_map['hello'])

# python 2.x
print word_to_vec_map[
'hello']

執行結果:

[-0.38497   0.80092   0.064106 -0.28355  -0.026759 -0.34532  -0.64253
 -0.11729  -0.33257   0.55243  -0.087813  0.9035    0.47102   0.56657
  0.6985   -0.35229  -0.86542   0.90573   0.03576  -0.071705 -0.12327
  0.54923   0.47005   0.35572   1.2611   -0.67581  -0.94983   0.68666
  0.3871   -1.3492    0.63512   0.46416  -0.48814   0.83827  -0.9246
 -0.33722   0.53741  -1.0616   -0.081403 -0.67111   0.30923  -0.3923
 -0.55002  -0.68827   0.58049  -0.11626   0.013139 -0.57654   0.048833
  0.67204 ]

  因為獨熱向量不能很好地表示詞語詞之間的相似性,所以使用了GloVe向量,它儲存了每個單詞更多、更有用的資訊,我們現在可以看看如何比較兩個詞的相似性。

1.1 - 餘弦相似度

  為了衡量兩個詞的相似程度,我們需要一種方法來衡量兩個詞的詞嵌入向量之間的相似程度,給定兩個向量uuvv,餘弦相似度定義如下:

(1-1)CosineSimilarity(u,v)=uvu2v2=cos(θ)CosineSimilarity(u, v) = \frac{u \cdot v}{||u||_2 ||v||_2} = cos(\theta)\tag{1-1}

  其中,uvu \cdot v是兩個向量的點積(內積),u2||u||_2uu的範數(長度),θ\thetauuvv之間的夾角角度,uuvv之間的相似度是基於他們之間的角度計算的,它們越相似,那麼cos(θ)cos(\theta)的值就越接近於1;如果它們很不相似,那麼他們的夾角就越大,cos(θ)cos(\theta)的值就越接近於-1。

圖 1-1:兩個向量之間的夾角的餘弦值用來衡量它們相似程度

接下來我們要實現一個計算兩個詞的相似度的函式cosine_similarity()

提醒uu 的範數是這樣定義的:u2=i=1nui2||u||_2 = \sqrt{\sum_{i=1}^{n} u_i^2}

def cosine_similarity(u, v):
    """
    u與v的餘弦相似度反映了u與v的相似程度
    
    引數:
        u -- 維度為(n,)的詞向量
        v -- 維度為(n,)的詞向量
        
    返回:
        cosine_similarity -- 由上面公式定義的u和v之間的餘弦相似度。
    """
    distance = 0
    
    # 計算u與v的內積
    dot = np.dot(u, v)
    
    #計算u的L2範數
    norm_u = np.sqrt(np.sum(np.power(u, 2)))
    
    #計算v的L2範數
    norm_v = np.sqrt(np.sum(np.power(v, 2)))
    
    # 根據公式1計算餘弦相似度
    cosine_similarity = np.divide(dot, norm_u * norm_v)
    
    return cosine_similarity

我們來測試一下:

father = word_to_vec_map["father"]
mother = word_to_vec_map["mother"]
ball = word_to_vec_map["ball"]
crocodile = word_to_vec_map["crocodile"]
france = word_to_vec_map["france"]
italy = word_to_vec_map["italy"]
paris = word_to_vec_map["paris"]
rome = word_to_vec_map["rome"]

print("cosine_similarity(father, mother) = ", cosine_similarity(father, mother))
print("cosine_similarity(ball, crocodile) = ",cosine_similarity(ball, crocodile))
print("cosine_similarity(france - paris, rome - italy) = ",cosine_similarity(france - paris, rome - italy))

測試結果:

cosine_similarity(father, mother) =  0.890903844289
cosine_similarity(ball, crocodile) =  0.274392462614
cosine_similarity(france - paris, rome - italy) =  -0.675147930817

 當然你也可以隨意修改其他的詞彙,然後看看它們之間的相似性。

1.2 - 詞類類比

  在這裡,我們將學習解決“A與B相比就類似於C與____相比一樣”之類的問題,打個比方,“男人與女人相比就像國王與 女皇 相比”。實際上我們需要找到一個詞dd,然後ea,eb,ec,ede_a, e_b, e_c, e_d滿足以下關係:ebeaedece_b - e_a \approx e_d - e_c,當然,ebeae_b - e_aedece_d - e_c是使用餘弦相似性來做判斷的。

def complete_analogy(word_a, word_b, word_c, word_to_vec_map):
    """
    解決“A與B相比就類似於C與____相比一樣”之類的問題
    
    引數:
        word_a -- 一個字串型別的詞
        word_b -- 一個字串型別的詞
        word_c -- 一個字串型別的詞
        word_to_vec_map -- 字典型別,單詞到GloVe向量的對映
        
    返回:
        best_word -- 滿足(v_b - v_a) 最接近 (v_best_word - v_c) 的詞
    """
    
    # 把單詞轉換為小寫
    word_a, word_b, word_c = word_a.lower(), word_b.lower(), word_c.lower()
    
    # 獲取對應單詞的詞向量
    e_a, e_b, e_c = word_to_vec_map[word_a], word_to_vec_map[word_b], word_to_vec_map[word_c]
    
    # 獲取全部的單詞
    words = word_to_vec_map.keys()
    
    # 將max_cosine_sim初始化為一個比較大的負數
    max_cosine_sim = -100
    best_word = None
    
    # 遍歷整個資料集
    for word in words:
        # 要避免匹配到輸入的資料
        if word in [word_a, word_b, word_c]:
            continue
        # 計算餘弦相似度
        cosine_sim = cosine_similarity((e_b - e_a), (word_to_vec_map[word] - e_c))
        
        if cosine_sim > max_cosine_sim:
            max_cosine_sim = cosine_sim
            best_word = word
            
    return best_word

我們來測試一下:

triads_to_try = [('italy', 'italian', 'spain'), ('india', 'delhi', 'japan'), ('man', 'woman', 'boy'), ('small', 'smaller', 'large')]
for triad in triads_to_try:
    print ('{} -> {} <====> {} -> {}'.format( *triad, complete_analogy(*triad,word_to_vec_map)))

測試結果:

italy -> italian <====> spain -> spanish
india -> delhi <====> japan -> tokyo
man -> woman <====> boy -> girl
small -> smaller <====> large -> larger

  你可以隨意地去更改上面的詞彙,看看能否拿到自己期望的輸出,你也可以試試能不能讓程式出一點小錯呢?比如:small -> smaller <===> big -> ? ,自己試試唄~

triads_to_try = [('small', 'smaller', 'big')]
for triad in triads_to_try:
    print ('{} -> {} <====> {} -> {}'.format( *triad, complete_analogy(*triad,word_to_vec_map)))

  現在詞類類比已經完成了,需要記住的是餘弦相似度是比較詞向量相似度的一種好方法,儘管使用L2距離(歐式距離)來比較也是可以的。

1.3 - 去除詞向量中的偏見(選學)

  在這一部分,我們將研究反映在詞嵌入中的性別偏差,並試著去去除這一些偏差,除了學習這個內容外,這一節還可以磨鍊你對單詞向量的直覺,這部分包含有線性代數,不是很難,如果你沒有學習過線性代數,那麼你可以跳過這一節,你也可以繼續深入下去。

  我們首先來看一下包含在詞嵌入中的性別偏差,我們首先計算一下g=ewomanemang = e_{woman} - e_{man},其中ewomane_{woman}是單詞“woman”對應的詞向量,emane_{man}是單詞“man”對應的詞向量,得到的結果gg粗略的包含了性別這一概念,但是如果你計算g1=emotherefatherg_1 = e_{mother} - e_{father}g2=egirleboyg_2 = e_{girl} - e_{boy}的平均值,可能會更準確一點,但是在這裡,ewomanemane_{woman} - e_{man}就已經足夠了。

g = word_to_vec_map['woman'] - word_to_vec_map['man']
print(g)

執行結果:

[-0.087144    0.2182     -0.40986    -0.03922    -0.1032      0.94165
 -0.06042     0.32988     0.46144    -0.35962     0.31102    -0.86824
  0.96006     0.01073     0.24337     0.08193    -1.02722    -0.21122
  0.695044   -0.00222     0.29106     0.5053     -0.099454    0.40445
  0.30181     0.1355     -0.0606     -0.07131    -0.19245    -0.06115
 -0.3204      0.07165    -0.13337    -0.25068714 -0.14293    -0.224957
 -0.149       0.048882    0.12191    -0.27362    -0.165476   -0.20426
  0.54376    -0.271425   -0.10245    -0.32108     0.2516     -0.33455
 -0.04371     0.01258   ]

現在,我們考慮不同單詞與gg的餘弦相似度,考慮相似度的正值與餘弦相似度的負值之間的關係。

name_list = ['john', 'marie', 'sophie', 'ronaldo', 'priya', 'rahul', 'danielle', 'reza', 'katy', 'yasmin']

for w in name_list:
    print (w, cosine_similarity(word_to_vec_map[w], g))

執行結果:

john -0.23163356146
marie 0.315597935396
sophie 0.318687898594
ronaldo -0.312447968503
priya 0.17632041839
rahul -0.169154710392
danielle 0.243932992163
reza -0.079304296722
katy 0.283106865957
yasmin 0.233138577679

正如我們所看見的,女性的名字與gg的餘弦相似度為正,而男性為負,這也不出乎人的意料,我們來看看其他詞:

word_list = ['lipstick', 'guns', 'science', 'arts', 'literature', 'warrior','doctor', 'tree', 'receptionist', 
             'technology',  'fashion', 'teacher', 'engineer', 'pilot', 'computer', 'singer']
for w in word_list:
    print (w, cosine_similarity(word_to_vec_map[w], g))

執行結果:

lipstick 0.276919162564
guns -0.18884855679
science -0.0608290654093
arts 0.00818931238588
literature 0.0647250443346
warrior -0.209201646411
doctor 0.118952894109
tree -0.0708939917548
receptionist 0.330779417506
technology -0.131937324476
fashion 0.0356389462577
teacher 0.179209234318
engineer -0.0803928049452
pilot 0.00107644989919
computer -0.103303588739
singer 0.185005181365

  發現了嗎?比如“computer”就接近於“man”,“literature ”接近於“woman”,但是這些都是不對的一些觀念,那麼我們該如何減少這些偏差呢?

  對於一些特殊的詞彙而言,比如“男演員(actor)”與“女演員(actress)”或者“祖母(grandmother)”與“祖父(grandfather)”之間應該是具有性別差異的,但是其他的詞彙比如“接待員(receptionist)”與“技術(technology )”是不應該有性別差異的,當我們處理這些詞彙的時候應該區別對待。

1.3.1 - 消除與性別無關的詞彙的偏差

  下面的一張圖表示了消除偏差之後的效果。如果我們使用的是50維的詞嵌入,那麼50維的空間可以分為兩個部分:偏置方向( bias-direction)gg與剩下的49維gg_{\perp},線上性代數中,我們可以這麼理解:49維的gg_{\perp}gg垂直(正交),即gg_{\perp}gg成90度角。就拿“receptionist”這個單詞舉例,在消除性別偏差的過程中,我們將ereceptioniste_{receptionist}沿著gg方向歸零,得到了ereceptionistdebiasede^{debiased}_{receptionist}

相關推薦

#課後程式設計作業Course 5

【中英】【吳恩達課後程式設計作業】Course 5 - 序列模型 - 第二週作業 - 詞向量的運算與Emoji生成器 資料下載 本文所使用的資料已上傳到百度網盤【點選下載(65.99MB)】,請在開始之前下載好所需資料。 【博主使用的python版本

機器學習隨筆什麽是機器學習?

都是 mea 預測 learn 會有 code 度量 its 價格 定義    Tom Mitchell對機器學習定義為“計算機從經驗E中學習,解決某一任務T,進行某一度量P,通過P測定在T上的表現因經驗E而提高”。定義個人覺得大體理解即可,如果扣文咬字去理解會十分痛苦,就

機器學習筆記Week4 ex3答案

與上一週作業相同,按著公式程式設計就好了 function [J, grad] = lrCostFunction(theta, X, y, lambda) %LRCOSTFUNCTION Compute cost and gradient for logisti

機器學習筆記week3:1/2邏輯迴歸

第三週 六、邏輯迴歸(Logistic Regression) 這裡首先區分一下線性迴歸和邏輯迴歸,線性迴歸就是擬合,邏輯迴歸是分類。 6.2 假說表式(Hypothesis Representation) 下面一個部分主要講的是假設函式h(x)在分類問題中輸出只能是0/

機器學習筆記第三章:線性迴歸回顧

本章是對線性代數的一些簡單回顧,由於之前學過,所以這裡只是簡單的將課程中的一些例子粘過來 矩陣表示 矩陣加法和標量乘法 矩陣向量乘法 用矩陣向量乘法來同時計算多個預測值 矩陣乘法 用矩陣乘法同時計算多個迴歸

機器學習筆記第五章:多變數線性迴歸

目錄 多特徵下的目標函式 多元梯度下降法 多元梯度下降法中的方法 特徵縮放 選擇學習率 特徵和多項式迴歸 正規方程(區別於迭代法的直接解法) 正規方程在矩陣不可逆的情況下的解決方法

機器學習筆記005 梯度下降(Gradient Descent)

一、引入        在前幾節課我們講到,我們希望能夠找到曲線擬合效果最好的線條,這樣的線條的誤差最小,所以就轉化成了下面這幅圖所表達的內容。        我們有一些函式,這些函式會有n個引數,我們希望能得到這個函式的最小值,為了方便計算,我們從最簡單的入手,讓引數的個數

深度學習課程第一週課後習題

先說明一下,以下答案均為個人見解,如有不同想法歡迎交流。另外轉載請註明出處,謝謝1.試分析‘AI是新能量’指的是:A.等價於100年前電的出現一樣,AI正在轉變大多數的產業B.AI和電一樣在生活和辦公中發揮著重要作用C.通過“智慧電力”,AI正在傳送一種電力的新浪潮D.AI執

目錄中文deplearning.ai課後作業目錄

【目錄】【吳恩達課後作業目錄】 課程 週數 名稱 型別 語言 地址 課程1 - 神經網路和深度學習 第1周

機器學習作業程式碼1

一:當訓練集為1維時 #進行資料分析所需庫,可以看做是對numpy工具的補充 import pandas as pd import numpy as np #應該把Seaborn視為matplotlib的補充,作圖所用工具,在大多數情況下使用seaborn就能做出很具有吸引力的圖,而使用matplo

machine learning 作業 第二週

featureNormalize.m function [X_norm, mu, sigma] = featureNormalize(X) %FEATURENORMALIZE Normalizes the features in X % FEATURENORMALIZE(X) return

演算法工程師修仙之路:機器學習作業(一)

吳恩達機器學習筆記及作業程式碼實現中文版 第一個程式設計作業:單變數線性迴歸(python程式碼實現) 一元線性迴歸 問題描述 在本練習的這一部分中,您將使用只有單變數的線性迴歸方法預測餐車的利潤。 假設你是一家連鎖餐廳的執行長,正在

機器學習作業(五):支援向量機

目錄 1)資料預處理 2)Scikit-learn支援向量機 3)決策邊界比較 4)非線性SVM 5)最優超引數 6)垃圾郵件過濾器 在本練習中,我們將使用支援向量機(SVM)來構建垃圾郵件分類器。 我們將從一些簡單的2D資料集開始使用SVM來檢視它們的工作原理。

機器學習作業Python實現(六):SVM支援向量機

1 Support Vector Machines 1.1 Example Dataset 1 %matplotlib inline import numpy as np import pandas as pd import matplotlib.pyplot

deeplearning課程作業環境

Deep learning課程安裝 Course 4 prerequisites: - 2017/2/14 keras /pydot / graphviz - 2017/2/20 pandas for week 3 - 2017/2/23 opencv

機器學習作業Python實現(一):線性迴歸

單變數線性迴歸 在本部分的練習中,您將使用一個變數實現線性迴歸,以預測食品卡車的利潤。假設你是一家餐館的執行長,正在考慮不同的城市開設一個新的分店。該連鎖店已經在各個城市擁有卡車,而且你有來自城市的利潤和人口資料。 您希望使用這些資料來幫助您選擇將哪個城市擴充

用純Python實現迴圈神經網路RNN向前傳播過程(DeepLearning.ai作業)

Google TensorFlow程式設計師點讚的文章!   前言 目錄:     - 向量表示以及它的維度     - rnn cell     - rnn 向前傳播 &nbs

機器學習學習筆記——1.5無監督學習

分類 哪些 rep epm 朋友 工作 style class 客戶 1 無監督學習:在不知道數據點的含義的情況下,從一個數據集中找出數據點的結構關系。 2 聚類算法:相同屬性的數據點會集中分布,聚集在一起,聚類算法將數據集分成不同的聚類。也就是說,機器不知道這些數據點具體

機器學習學習筆記——2.1單變量線性回歸算法

工作方式 樣本 body 聚類 屬性 bsp 定義 算法 信息 1 回顧1.1 監督學習定義:給定正確答案的機器學習算法分類:(1)回歸算法:預測連續值的輸出,如房價的預測(2)分類算法:離散值的輸出,如判斷患病是否為某種癌癥1.2 非監督學習定義:不給定數據的信息的情況下

機器學習學習筆記——代價函數

info alt 學習 ima 代價函數 png 線性回歸 gpo mage 單變量線性回歸函數 hθ(x) = θ0 + θ1x 為了使線性回歸函數對數據有較好的預測性,即y到h(x)的距離都很小。 【吳恩達機器學習】學習筆記——代價函數