跳到主要內容

Classification (ML) 和學英文都需要大量的訓練資料

最近聽 TED 練英文發覺有趣的事。TED上的題材五花八門,講者來自世界各地,讓我提早體會到不同發音的問題。若只在單家補習班練英文,大概無法體會到世界各地的腔調。體會歸體會,這樣聽下去能否一次通殺是另一個問題。

在練習聽力的同時,我同時觀察自己怎麼理解這些發音的。這實在是很奇妙的過程,有些音明明和標準發音差了十萬八千里,但是一連串的字彙連起來,卻能立即明白整句在說什麼 (比方 "William Kamkwamba: How I harnessed the wind" );有些字彙即使講得再標準,沒有相關知識也聽不懂 (即使是母語也是如此)。看來重點是前後文和背景知識。

以往學英文時總強調要多背單字,我試過幾次都失敗,我實在不是背書的料,但我深信有需求自然會用。回顧過去失敗的經驗,我發覺用不到的字背再多次也記不起來。更何況,既然 (幾乎) 用不到,背它們做什麼?投資報酬率太低了。反過來說,常用的字一再出現,有時不用查單字也能依上下文推論出它的意思。而且還會模糊地學會它在不同情況的差異,但要仔細地描述它是什麼意思,卻又說不上來。

這樣的學習過程中,我發覺若要增加我認識的字彙,我得聽讀更多內容,才能交差地認得這些單字。像我昨天讀 "2 China Schools Said to Be Tied to Online Attacks" 學到一些單字,其中一個單字是 specialist,意思是專家。今天重聽 "Ken Robinson says schools kill creativity" 又聽到 specialist,我自然就記得了。但若這幾天或幾週內沒再碰到 specialist,我可能會忘記。我得每天花上一小時以上的時間訓練英文能力,才能持續增長我的字彙。

想到這裡,忽然發現這和 classification 認得特徵 (feature) 的方式相似。提供大量的訓練資料和它們對應的分類,learning model 自然會從訓練資料中找到重覆的特徵,分辨出那些特徵和某些分類有關或是反相關。在同樣數量的訓練資料中,若訓練資料的內容相似、特徵類型集中,model 可以更精確地掌握特徵,但也會因此認得較少特徵;反過來說,若想認得更多特徵,得讓內容發散,但很可能學錯特徵。若想同時學得又準又多,只好提供更多訓練資料。

對應回英文字彙也是如此。若我想習得準確且多量的英文字彙,只好持續投入大量時間接觸英文。雖說是理所當然的事,想通後才更甘心地花時間練英文。話說回來,不同的 learning model 用不同方式掌握分類和特徵的關係。強的 model 可以用較少的資料學得又準又多。人腦這麼強大,應當能更有效率地學英文。雖說持續投入時間接觸英文是必要的,也要不斷摸索如何學得更有效率。目前的想法是當我能用自己的話用上這些字彙時,就能記牢它們。所以要試著用這些字造句,或直接重述一遍原文。很土法煉鋼的作法,總比過去坐在那唉唉叫都不動來得好。

附帶一提,人類學習語文時會不斷用上背景知識和前後文,classification 卻缺少這兩項東西,使得這類解法侷限在特定領域,被歸類到 applied AI。我還無法想像如何將人類的背景知識 (或稱常識?) 編入電腦,但至少待電腦的運算能力和記憶體更大之後 (這是可預見的發展),電腦可以認得更廣的前後文 (現今的作法最多只看三個字彙左右),配合更大量的訓練資料,也許會有出乎意料的進展。就像電腦在解決下棋之類的益智遊戲時,並無法如人類用較少的模式掌握情況,但能用較簡單的方式配合大量運算達到更好的效果。

留言

  1. 我覺得聽母語不是英文的人講英文也比較容易懂,就算是有口音。可能是用字上的差別吧

    回覆刪除
  2. 除用字簡單外, 還有說話速度較慢。我有聽過母語為英文但很好懂的, 也聽過非英文講得不好懂的。感覺上和是否為母語關聯不大。

    回覆刪除

張貼留言

這個網誌中的熱門文章

(C/C++ ) 如何在 Linux 上使用自行編譯的第三方函式庫

以使用 LevelDB 為例。 抓好並編好相關檔案,編譯方式見第三方函式庫附的說明:$ ls include/ # header files leveldb/ $ ls out-shared/libleveldb.so* # shared library out-shared/libleveldb.so@ out-shared/libleveldb.so.1@ out-shared/libleveldb.so.1.20* 下面的例子用 clang++ 編譯,這裡用到的參數和 g++ 一樣。 問題一:找不到 header$ clang++ sample.cpp sample.cpp:5:10: fatal error: 'leveldb/db.h' file not found #include "leveldb/db.h" ^ 1 error generated. 解法:用 -I 指定 header 位置 問題二:找不到 shared library$ clang++ sample.cpp -I include/ /tmp/sample-2e7dd8.o: In function `main': sample.cpp:(.text+0x1e): undefined reference to `leveldb::Options::Options()' sample.cpp:(.text+0x6f): undefined reference to `leveldb::DB::Open(leveldb::Options const&, std::string const&, leveldb::DB**)' sample.cpp:(.text+0x10c): undefined reference to `leveldb::Status::ToString() const' sample.cpp:(.text+0x7d0): undefined reference to `leveldb::Status::ToString() const' clang: error: linker command failed with exit code 1 (u…

virtualbox 使用 USB 裝置

2012-12-16 更新 現在 (4.x 版) 似乎無需做任何設定, 只要有裝 Oracle VM VirtualBox Extension Pack, 在 VirtualBox 視窗右下角按 USB 的圖示, 再點目標裝置, 即可加入或移除該裝置 同一時間只有 host 或 guest 可擁有該裝置, 所以從 guest OS 移除, 相當於接回 host OS 目前 VirtualBox 只支援 USB 2.0 的插槽, 若偵測不到時, 注意一下是否為這個問題 有時拔拔插插, VirtualBox 會進入奇怪的狀態, 接上去 guest OS 無法連接且跳出 device is busy 的錯誤訊息。試看看拔除該裝置, 重開 guest OS (續上則) 若重開 guest OS 無效, 並且 host OS 已移除該裝置, VirtualBox 的 USB 清單卻仍顯示 "captured", 試看看拔除該裝置, 重開 host OS原文網路上搜一下, 比較多是 Ubuntu 當 host 的解法, 我的情況是 Win7 當 host, Ubuntu 當 guest。 這兩篇說明很詳細《Learn How to Set Up USB and Networking Options in VirtualBox》《幻影千瞳的部落格: VirtualBox 使用筆記(二):使用 USB 裝置》 現在的版本圖形介面很好用了, 不用像第二篇說的那樣用指令操作。這裡記下我的操作步驟: 關掉 guest OS 在 VirtualBox 選單, 選擇 guest OS -> Settings -> USB -> Enable USB 2.0 會出現訊息框, 說明要安裝 Oracle VM VirtualBox Extension Pack。下載後安裝它 host OS 插入 USB 隨身碟 在 VirtualBox 選單, 選擇 guest OS -> Settings -> USB, 點右邊有綠色 "+" 的 USB 頭的圖示, 選擇該 USB 隨身碟, 加入它的 filter 從 host OS 移除 USB 隨身碟 開啟 guest OS 插入 USB 隨身碟, 於是 guest OS 會自動偵測…

熟悉系統工具好處多多

記一下以前很困擾, 現在秒殺的小事。 更新這篇的時候, 忘了函式庫用的 man page 裝在那個 package。以前就會想辦法 google, 運氣好一下會找到, 運氣不好會多找一會兒。 這回我想到新作法:$ strace -e open man 3 printf > /dev/null # 發現是讀 /usr/share/man/man3/printf.3.gz $ dpkg --search /usr/share/man/man3/printf.3.gz # 找到套件名稱 manpages-dev $ aptitude show manpages-dev # 確認描述符合, 收工