Categories
程式開發

軟件開發人員學習ML:是不是本末倒置了?


大部分人學習ML時都會從頭開始學起,但有經驗的開發者卻並不應該這樣,因為他們學習編程語言的經歷會讓他們更好的學習到ML。

我還記得第一次學寫代碼的情景。當時我還在上高中,我的程序員父親打開文本編輯器,敲入了這些代碼:

public class HelloWorld {
    public static void main(String() args) {  
        System.out.println("Hello World.");
    }
}

我問他:“這段代碼幹嘛用的?”

他答道:“它會在屏幕上打印‘Hello World’。”

“public是什麼?class是什麼?static是什麼?……”

“先不要在意這些,它們都只是模板代碼。”

但這些所謂的模板代碼讓我感到很疑惑,於是我開始了解這些關鍵字的意思。事實證明,這些複雜而無聊的東西給我年輕的編程夢想蒙上了一層陰影。

現在學習軟件開發比我上高中時要容易得多,這要感謝像codecademy.com這樣的網站,它們提供了基本的開發環境,傾向於教授解釋型編程語言,比如Python和Javascript。你可以在幾分鐘內從對編程一無所知變成能夠寫出第一條可以在瀏覽器上執行的條件語句。沒有繁瑣的環境設置、安裝、編譯器或樣板代碼——你直接進入編程最有趣的部分。

這是人類最好的學習方式。首先,我們被灌輸高層次的核心概念,然後開始理解具體細節。我們先學習Python,然後是C語言,然後是彙編,而不是反過來。

不幸的是,現在很多學習ML的人跟我第一次接觸Java時的情況完全一樣。他們最先被灌輸所有的底層細節——分層架構、反向傳播、dropout等,然後會覺得ML很複雜,認為需要先掌握線性代數,最後就想著要放棄。

這個有點遺憾,因為在不久的將來,大多數ML開發人員將不再需要考慮或了解任何底層的東西,就像我們通常不需要編寫彙編代碼或自己實現TCP協議棧或加密庫一樣,ML將成為我們的工具,工具的實現細節交給一小部分專家就可以了。到了這個時候——也就是在ML被“大眾化”之後——開發人員需要了解的不是實現細節,而是如何部署這些智能算法。

ML發展到了什麼程度

現在,如果你想要開發一個神經網絡來識別照片中的貓或者預測你的下一條推文是否會被瘋傳,可以學一下TensorFlow或PyTorch。這些基於Python的深度學習庫是目前最流行的設計神經網絡的工具,它們都不到5歲。

在它短暫的生命週期中,TensorFlow已經變得比5年前友好得多。在早期,要成為一個高效的TensorFlow程序員,你不僅要了解ML,還要了解分佈式計算和圖架構。即使是寫一個簡單的打印語句也很費勁。

軟件開發人員學習ML:是不是本末倒置了? 1

今年秋季,TensorFlow 2.0正式發布,它對開發人員更加友好。下面是使用TensorFlow 2.0構建一個“Hello World”模型的代碼:

model = tf.keras.models.Sequential((
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(32, activation='relu'),
    tf.keras.layers.Dense(1, activation='softmax')
))
model.compile(optimizer='adam',
                            loss='sparse_categorical_crossentropy'),
                            metrics=('accuracy')))
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)

如果你以前設計過神經網絡,就很容易看懂上面這段代碼。但如果之前沒學過,或者正在學習,可能就會有一些問題。比如,dropout是什麼意思?這些密集的層是什麼東西?你需要多少層,應該把它們放在哪裡? sparse_categorical_crossentropy又是什麼? TensorFlow 2.0確實簡化了構建模型時的一些繁文縟節,但並沒有將模型的實際架構設計抽離出去。

未來會怎樣

那麼,ML工具的未來會是什麼樣子呢?谷歌、亞馬遜、微軟和蘋果公司的人都在花時間研究這個問題。另外,作為谷歌的一名工程師,我也花了很多時間思考這個問題。

首先,我們將會看到越來越多的開發人員使用預先訓練好的模型來完成常見的任務。也就是說,我們將不再自己收集數據和訓練神經網絡,而是使用谷歌、亞馬遜和微軟提供的模型。很多雲廠商已經在做類似的事情了。例如,你可以通過調用谷歌云的REST端點來使用預先訓練好的神經網絡,用它們來:

  • 抽取圖像中的文本;
  • 標記照片中的物體;
  • 把語音轉成文本;
  • 翻譯不同的語言;
  • 識別文本的情感色彩;
  • 其他

你也可以使用谷歌的ML Kit或蘋果的Core ML等工具在移動設備上運行預先訓練好的模型。

坦率地說,與自己使用TensorFlow構建的模型相比,預先訓練好的模型更加準確,因為它們是由谷歌研究人員基於整個互聯網的數據訓練出來的,他們使用了大量的GPU和TPU。

預訓練模型的缺點是,它們解決的是一般性問題,比如識別圖像中的貓和狗,而不是特定領域的問題,比如識別裝配線上某個部件的缺陷。

但即使是為特定領域的任務訓練特定的模型,ML工具對我們也很友好。

軟件開發人員學習ML:是不是本末倒置了? 2

Teachable Machine——一個在瀏覽器中構建視覺、手勢和語音模型的工具

谷歌的Teachable Machine為用戶提供了拖放式界面,可以直接在瀏覽器中收集數據和訓練模型。今年早些時候,麻省理工學院發布了一個類似的無代碼界面,用來構建在觸摸屏設備上運行的模型,這個界面是為醫生等非編程人員設計的。微軟和一些初創公司(lobe.ai)也提供了類似的解決方案。 Google Cloud AutoML是一個企業級的自動化模型訓練框架。

現在要學些什麼

隨著ML工具變得越來越容易使用,(不需要成為專家的)開發人員的技能也將發生變化。所以,你現在應該學些什麼?

要知道什麼時候該用ML並不容易

ML算法與其他軟件的不同之處在於它們具有概率性。即使是一個高度精確的模型有時也會出錯,這意味著它並不是很多問題的正確解決方案。以基於ML的語音到文本轉換算法為例:有時候,你想讓Alexa“關掉音樂”,它卻幫你把鬧鐘調到凌晨4點。如果醫學版的Alexa把醫生說的Adderall(一種治療多動症的藥)誤解成Enulose(一種緩瀉藥),那就糟糕了。

知道何時以及如何在生產環境中使用ML模型始終是一個難題,在這些情況下尤為如此:

  1. 風險很高;
  2. 人力資源有限;
  3. 人類有偏見,預測不准確。

以醫學成像為例。現在全球範圍內都很缺醫生,而ML模型在診斷疾病方面往往比訓練有素的醫生更準確,但你會希望讓一個算法來決定你是否患有癌症嗎?用於幫助法官判決刑期的ML模型也類似。模型是有偏見的,人也是。

知道什麼時候可以使用ML以及如何正確地部署ML模型並不是一件容易的事情,而這個問題不會很快得到解決。

可解釋性

眾所周知,ML模型是不透明的,所以它們有時候也被叫作“黑匣子”。如果你只是把“這是我的神經網絡告訴我的”作為唯一的證據,就不太可能說服你的副總裁做出重大的商業決策。另外,如果你不明白為什麼你的模型會做出這樣的預測,也可能就意識不到它會做出有偏見的決定(例如,拒絕貸款給特定年齡層或屬於某個郵政編碼區域的人) 。

正因為如此,ML領域的很多參與者都專注於構建“可解釋的AI”特徵工具——可以讓用戶檢查模型使用了什麼特徵進行預測。但從整個行業的角度來看,我們還沒有完全解決這個問題,不過我們正在取得進展。 11月份,谷歌發布了一套可解釋性工具和Model Cards——一種幫助用戶理解ML模型局限性的可視化指南。

軟件開發人員學習ML:是不是本末倒置了? 3

谷歌的臉部識別Model Card顯示了該模型的局限

創造性的應用

有些開發人員擅長機器學習,有些研究人員擅長神經科學,但很少有人同時精通這兩個領域。這個問題幾乎在任何復雜的領域中都存在。未來幾年,ML的主要進步可能不是數學方法方面的改進,而是來自不同專業領域的人學會了足夠多的機器學習知識,並將其應用到他們的領域中。例如,醫學成像領域最令人感到興奮的突破——通過掃描就能發現有害疾病——並不是因為應用了新的神經網絡架構,而是因為將標準模型應用在了新奇的問題上。因此,如果你是一名軟件開發人員,並且掌握了額外的專業知識,那你就已經走在了別人的前面。

如果我現在從頭開始學習AI,至少會關注這些問題。我發現自己花在從頭構建模型上的時間越來越少,而是越來越多地使用高級工具,如AutoML和AI API,並將注意力集中在應用程序開發上。

原文鏈接:
https://towardsdatascience.com/software-developers-youre-learning-machine-learning-upside-down-3867dc140862