機器學習專案成功的關鍵在於前期縝密的規劃與評估。從產品目標出發,將其轉化為機器學習問題框架,並考量資料集特性與模型能力,才能有效降低專案風險。常見的模型選擇包括分類別、迴歸、時間序列預測、異常檢測等,而資料集則可分為已標記、弱標記及未標記資料。選擇合適的模型和資料集是 iterative 的過程,需要不斷調整與驗證。以開發寫作輔助編輯器為例,可先從弱標記資料集開始,逐步最佳化模型,並考量模型的訓練時間、推理速度及資源需求等因素,才能有效提升專案成功率。
機器學習問題的可行性評估
在眾多的研究論文或企業部落格中,每一個成功的機器學習(ML)應用背後,都有數百個聽起來合理的想法最終失敗。雖然目前尚無萬無一失的方法來預測機器學習的成功,但有一些指導方針可以幫助降低開展機器學習專案的風險。最重要的步驟是從產品目標開始,然後決定最佳的解決方案。在此階段,應對任何可行的方法保持開放態度,無論是否需要機器學習。在考慮機器學習方法時,應根據其對產品的適用性進行評估,而非僅憑方法的有趣程度。
實作這一目標的最佳方法是遵循兩個連續的步驟:
- 將產品目標置於機器學習正規化中
- 評估該機器學習任務的可行性
根據評估結果,可以調整框架直到滿意為止。讓我們來探討這些步驟的真正含義。
將產品目標置於機器學習正規化中
當我們構建一個產品時,首先思考的是我們要為使用者提供什麼服務。如同前言中提到的,我們將在本文中使用一個編輯器的案例研究來說明概念,該編輯器幫助使用者寫出更好的問題。這個產品的目標很明確:我們希望使用者在撰寫內容時獲得可行的和有用的建議。然而,機器學習問題的框架卻完全不同。機器學習問題關注的是從資料中學習一個函式。例如,從一種語言中的句子學習並輸出到另一種語言。對於一個產品目標,通常有多種不同的機器學習公式,其實作難度各不相同。
評估機器學習的可行性
並非所有的機器學習問題都是一樣的!隨著我們對機器學習理解的演進,像建立一個模型來正確分類別貓狗照片的問題已經可以在幾個小時內解決,而其他問題,如建立一個能夠進行對話的系統,仍然是開放的研究問題。為了高效地構建機器學習應用,考慮多種潛在的機器學習框架並從我們認為最簡單的開始是非常重要的。評估機器學習問題難度的一種最佳方法是檢視它所需的資料型別以及可以利用這些資料的現有模型。
模型
在機器學習中,有許多常用的模型,我們在此不對所有模型進行概述。有興趣的讀者可以參考「額外資源」中列出的書籍以獲得更全面的概述。除了常見的模型之外,每週都會發布許多模型變體、新穎的架構和最佳化策略。僅在2019年5月,就有超過13,000篇論文被提交到ArXiv,這是一個流行的研究電子檔案函式庫,經常提交關於新模型的論文。
然而,分享不同類別模型的概述以及如何將它們應用於不同的問題是有用的。為此,這裡提出了一個簡單的模型分類別法,根據模型如何處理問題。你可以將其作為選擇解決特定機器學習問題的方法的。由於模型和資料在機器學習中緊密相關,你會注意到本文與「資料型別」之間存在一些重疊。
機器學習演算法的分類別
機器學習演算法可以根據是否需要標籤進行分類別。這裡,標籤指的是資料中是否存在模型對於給定範例應產生的理想輸出。監督式演算法利用包含輸入標籤的資料集,旨在學習從輸入到標籤的對映。無監督式演算法則不需要標籤。弱監督式演算法則利用那些不完全是所需輸出但在某些方面與之相似的標籤。
許多產品目標既可以透過監督式演算法也可以透過無監督式演算法來實作。例如,詐欺檢測系統可以透過訓練模型來檢測與平均交易不同的交易來構建,而不需要標籤。也可以透過手動標記交易為詐欺或合法,並訓練模型從這些標籤中學習來構建這樣的系統。對於大多數應用程式,監督式方法更容易驗證,因為我們可以存取標籤來評估模型預測的品質。這也使得訓練模型變得更容易,因為我們可以存取所需的輸出。儘管建立標記資料集有時可能需要耗費時間,但它使得構建和驗證模型變得更加容易。因此,本文將主要涵蓋監督式方法。
選擇適合的機器學習方法
決定模型的輸入和輸出將有助於大幅縮小潛在方法的範圍。根據這些型別,以下任何一類別機器學習方法都可能是合適的:
- 分類別和迴歸
- 知識提取
- 目錄組織
- 生成模型
分類別和迴歸
一些專案專注於有效地將資料點分類別到兩個或更多類別之間,或在連續尺度上為它們賦予一個值(稱為迴歸而非分類別)。迴歸和分類別在技術上是不同的,但通常解決它們的方法有很大的重疊,因此我們將它們放在一起討論。
分類別和迴歸之所以相似的原因之一是,大多數分類別模型都會輸出一個物件屬於某個類別的機率分數。然後,分類別方面就歸結為決定如何根據這些分數將物件歸屬到某個類別。在較高的層面上,分類別模型因此可以被視為對機率值進行迴歸。
通常,我們會對個別範例進行分類別或評分,例如垃圾郵件過濾器將每封電子郵件分類別為有效或垃圾郵件,詐欺檢測系統將使用者分類別為詐欺或合法,或者電腦視覺放射線學模型將骨骼分類別為骨折或健康。
在圖1-2中,您可以看到根據句子的情感和涵蓋的主題對句子進行分類別的範例。
圖表翻譯:
此圖示展示了一個句子根據其情感和主題進行分類別的例子。圖中明確展示了不同的分類別結果及其對應的機率值,從而說明瞭分類別模型的實際應用。
內容解密:
圖1-2中的範例展示瞭如何使用分類別模型對句子進行情感分析和主題分類別。首先,模型會對輸入的句子進行分析,然後輸出該句子屬於不同情感類別(如正面、負面或中立)和不同主題類別(如體育、政治或娛樂)的機率。根據這些機率,可以確定句子的情感傾向和主要主題。這種技術在社交媒體監控、市場研究和新聞摘要等領域具有廣泛的應用價值。
圖表翻譯: 此圖示展示了句子分類別模型的流程。首先,輸入句子經過情感分析和主題分類別兩個處理步驟。情感分析進一步分為正面、負面和中立三種類別,而主題分類別則將句子歸類別為體育、政治或娛樂等不同主題。這種結構化的流程圖清晰地展示了模型的運作方式及其決策路徑。
透過這種結構化的介紹,我們可以更深入地理解如何評估機器學習問題的可行性,並選擇合適的方法來解決實際問題。同時,這也強調了了解不同型別模型及其應用場景的重要性,從而更好地應對各種機器學習挑戰。
機器學習專案的多樣性與應用
在機器學習(ML)的世界中,專案的多樣性遠遠超出了簡單的分類別和迴歸問題。根據不同的應用場景和資料型別,機器學習可以分為多種類別,每種類別都有其特定的挑戰和解決方案。
分類別與迴歸
在許多機器學習專案中,分類別和迴歸是兩種基本的任務。分類別涉及將資料分為不同的類別,例如判斷一封電子郵件是否是垃圾郵件。迴歸則是預測一個連續的值,例如根據房屋的屬性預測其銷售價格。
程式碼範例:簡單的線性迴歸
import numpy as np
from sklearn.linear_model import LinearRegression
# 建立一些範例資料
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([2, 3, 5, 7, 11])
# 建立線性迴歸模型
model = LinearRegression()
# 訓練模型
model.fit(X, y)
# 進行預測
y_pred = model.predict(np.array([[6]]))
print(f"預測值:{y_pred[0]}")
內容解密:
- 這段程式碼展示瞭如何使用
scikit-learn實作簡單的線性迴歸。 - 首先,我們匯入必要的函式庫並建立一些範例資料。
- 然後,我們建立一個線性迴歸模型並使用資料對其進行訓練。
- 最後,我們使用訓練好的模型進行預測。
時間序列預測
在某些情況下,我們需要根據過去的一系列資料點來預測未來的事件。這被稱為時間序列預測。時間序列資料可以代表患者的醫療記錄或國家公園的遊客數量。
異常檢測
異常檢測是另一類別重要的機器學習任務,涉及從資料集中檢測異常事件。這通常需要特殊的模型和特徵工程技術。
特徵選擇與生成
良好的分類別和迴歸工作往往需要大量的特徵選擇和特徵工程。特徵選擇涉及識別具有最強預測能力的特徵子集,而特徵生成則是透過修改和組合現有特徵來建立新的預測因子。
從非結構化資料中提取知識
非結構化資料是指不以表格格式儲存的資料,例如文字、影像和音訊。知識提取模型專注於從非結構化資料中提取結構化的資訊。
知識提取流程
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title ML 專案可行性評估框架
package "評估步驟" {
component [1. 產品目標轉化\n置於 ML 正規化] as step1
component [2. 評估 ML 任務\n可行性] as step2
component [3. 調整框架\n直到滿意] as step3
}
package "模型類型選擇" {
component [分類與迴歸\nClassification/Regression] as classify
component [知識提取\nKnowledge Extraction] as knowledge
component [目錄組織\nCatalog Organization] as catalog
component [生成模型\nGenerative Models] as generative
}
package "資料類型考量" {
component [已標記資料\n監督式學習] as labeled
component [弱標記資料\n弱監督式學習] as weak_labeled
component [未標記資料\n非監督式學習] as unlabeled
}
package "評估因素" {
component [訓練時間需求] as train_time
component [推理速度需求] as infer_speed
component [資源需求] as resources
component [模型可解釋性] as explainability
}
step1 --> step2 : 流程
step2 --> step3 : 迭代
step3 --> step1 : 調整
classify --> labeled : 適用
knowledge --> labeled : 適用
catalog --> unlabeled : 適用
generative --> weak_labeled : 適用
train_time --> step2 : 評估因素
infer_speed --> step2
resources --> step2
explainability --> step2
note right of classify
分類範例:
- 垃圾郵件過濾
- 詐欺偵測
- 情感分析
end note
note right of generative
生成模型應用:
- 文字生成
- 影像合成
- 資料增強
end note
@enduml
圖表翻譯:
- 此圖示展示了從非結構化資料到結構化資訊的知識提取流程。
- 首先,非結構化資料被輸入到知識提取模型中。
- 然後,模型提取出結構化的資訊。
- 最後,這些結構化的資訊可以被用於各種下游應用。
目錄組織
目錄組織模型通常會產生一組結果以呈現給使用者。這些結果可以根據使用者的輸入或之前的使用者模式進行調整,例如推薦系統。
機器學習模型與資料處理
在機器學習(ML)的領域中,不同型別的模型需要不同的資料來進行訓練。常見的模型選擇往往取決於能夠獲得的資料,而資料的可取得性通常是驅動模型選擇的關鍵因素。
生成式模型
生成式模型專注於生成資料,可能取決於使用者輸入。由於這些模型關注的是生成資料,而不是將資料分類別、評分、提取資訊或組織,因此它們通常具有廣泛的輸出範圍。這使得生成式模型特別適合像翻譯這樣的任務,其中輸出結果極為多樣。
然而,生成式模型的輸出往往較為不受限,這使得它們在生產環境中較為冒險。因此,除非必要,否則建議先從其他模型開始。不過,對於想要深入研究生成式模型的讀者,David Foster 的《生成式深度學習》是一本值得推薦的書籍。
實際的例子包括翻譯,將句子從一種語言對映到另一種語言;摘要;字幕生成,將影片和音軌對映到文字記錄;以及神經風格轉換(如 Gatys 等人的《藝術風格的神經演算法》),將影像對映到風格化的版本。
圖表 1-8:風格轉換範例
此圖示展示了一個生成式模型將左側的照片轉換為右側類別似畫作風格的範例。
圖表翻譯: 此圖表展示了生成式模型的應用,特別是風格轉換技術,將一張普通的照片轉換成具有特定畫作風格的影像。左側是原始照片,右側是經過風格轉換後的結果。
資料
監督式機器學習模型利用資料中的模式來學習輸入和輸出之間的對映。如果資料集包含預測目標輸出的特徵,那麼合適的模型應該能夠從中學習。然而,在大多數情況下,我們最初並沒有合適的資料來訓練模型以端對端地解決產品使用案例。
例如,假設我們正在訓練一個語音辨識系統,該系統將傾聽客戶的請求、理解其意圖並根據該意圖執行操作。在開始這個專案時,我們可能會定義一組想要理解的意圖,例如“在電視上播放電影”。要訓練機器學習模型來完成這項任務,我們需要一個包含不同背景使用者以自己的方式請求系統播放電影的音訊片段的資料集。擁有代表性的輸入集至關重要,因為任何模型只能從我們提供給它的資料中學習。
資料型別
一旦我們將問題定義為將輸入對映到輸出,我們就可以搜尋遵循這種對映的資料來源。對於詐欺偵測,這些可能是詐欺和無辜使用者的例子,以及他們帳戶中可用於預測其行為的特徵。對於翻譯,這將是來源和目標域中的句子對的語料函式庫。對於內容組織和搜尋,這可能是過去搜尋和點選的歷史記錄。
我們很少能夠找到我們正在尋找的確切對映。因此,考慮幾種不同的情況是有用的。可以將其視為資料需求的層次結構。
資料可取得性
資料可取得性大致有三個層次,從最佳情況到最具挑戰性的情況。不幸的是,就像大多數其他任務一樣,通常可以假設最有用的資料型別將是最難找到的。
已有標記資料
這是圖 1-9 中最左邊的類別。在進行監督式模型工作時,找到一個標記資料集是每個從業者的夢想。這裡所謂的標記,是指許多資料點包含模型試圖預測的目標值。這使得訓練和評估模型品質變得更加容易,因為標記提供了真實答案。然而,在實踐中,找到一個符合需求且可在網路上免費取得的標記資料集是罕見的。
已有弱標記資料
這是圖 1-9 中的中間類別。一些資料集包含的標記與建模目標並不完全一致,但與之相關。例如,音樂串流服務的播放和跳過歷史可以被視為預測使用者是否不喜歡某首歌的弱標記資料集。雖然聽眾可能沒有明確標記某首歌為不喜歡,但如果他們在播放時跳過了它,這表明他們可能不太喜歡它。弱標記本質上不如精確標記那麼精確,但通常比完美標記更容易找到。
已有未標記資料
這是圖 1-9 中最右邊的類別。在某些情況下,雖然我們沒有將所需的輸入對映到輸出的標記資料集,但至少我們可以存取包含相關範例的資料集。例如,對於文字翻譯,我們可能可以存取大量兩種語言的文字,但它們之間沒有直接的對映關係。這意味著我們需要標記資料集,找到可以從未標記資料中學習的模型,或者兩者兼而有之。
需要取得資料
在某些情況下,我們距離未標記資料只有一步之遙,因為我們首先需要取得它。在許多情況下,我們沒有所需的資料集,因此需要找到取得這種資料的方法。這通常被視為一項難以克服的任務,但現在有很多方法可以快速收集和標記資料。這將是第 4 章的重點。
對於我們的案例研究來說,一個理想的資料集將是一組使用者輸入的問題,以及一組更好的措辭的問題。一個弱標記的資料集將是一個包含許多問題的資料集,其中包含一些表明其品質的弱標記,例如“喜歡”或“贊同”。這將有助於模型學習什麼是好的和壞的問題,但無法提供並排比較的範例。你可以在圖 1-9 中看到這兩個範例。
程式碼範例與解析
# 定義一個簡單的神經網路模型
import torch
import torch.nn as nn
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(5, 10) # 輸入層到隱藏層
self.fc2 = nn.Linear(10, 5) # 隱藏層到輸出層
def forward(self, x):
x = torch.relu(self.fc1(x)) # 使用ReLU啟用函式
x = self.fc2(x)
return x
# 初始化模型、損失函式和最佳化器
model = SimpleNN()
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# 訓練模型
for epoch in range(100):
# 前向傳播
inputs = torch.randn(10, 5)
outputs = model(inputs)
loss = criterion(outputs, torch.randn(10, 5))
# 反向傳播和最佳化
optimizer.zero_grad()
loss.backward()
optimizer.step()
print('Epoch {}: Loss = {:.4f}'.format(epoch+1, loss.item()))
內容解密:
- 定義神經網路模型:首先,我們定義了一個簡單的神經網路
SimpleNN,它繼承自nn.Module。這個網路包含兩個全連線層(fc1和fc2)。 - 前向傳播:在
forward方法中,我們定義了輸入資料的前向傳播路徑。首先,輸入透過第一個全連線層,然後應用ReLU啟用函式,最後透過第二個全連線層輸出。 - 初始化模型、損失函式和最佳化器:我們例項化了
SimpleNN模型,並定義了均方誤差(MSE)作為損失函式,使用隨機梯度下降(SGD)作為最佳化器。 - 訓練模型:在訓練迴圈中,我們進行前向傳播計算輸出和損失,然後進行反向傳播更新模型引數。每個epoch,我們列印當前的損失值。
機器學習中的資料集迭代與模型選擇
在機器學習(ML)領域中,弱標籤資料集(weakly labeled dataset)是指那些包含有助於模型學習的資訊,但並非完全精確的真實資料。在實際應用中,大多數可收集到的資料集都屬於弱標籤資料集。擁有不完美的資料集是完全可以接受的,不應成為開展工作的障礙。機器學習的過程本質上是迭代的,因此,從一個資料集開始並獲得初步結果是推進專案的最佳方式。
資料集的迭代性質
在許多情況下,由於無法立即找到包含直接對映到期望輸出的輸入資料集,建議逐步迭代地重新制定問題,使其更容易找到合適的初始資料集。每個探索和使用的資料集都將提供寶貴的資訊,用於企劃下一版本的資料集並為模型生成有用的特徵。
將機器學習應用於編輯器
讓我們深入研究案例,看看如何利用所學知識來識別不同的模型和資料集,並選擇最合適的方案。
機器學習編輯器的框架
首先,我們需要將產品目標(幫助使用者寫出更好的問題)轉化為機器學習正規化。我們的目標是建立一個編輯器,接受使用者的問題並改進它們,使其寫得更好。但什麼是「更好」?讓我們從更清楚地定義寫作輔助工具的產品目標開始。
許多人在論壇、社交網路和像Stack Overflow這樣的網站上尋找問題的答案。然而,人們提問的方式對是否能獲得有用的答案有著巨大的影響。這對於希望獲得問題答案的使用者以及未來可能遇到相同問題並可能從現有答案中受益的使用者來說都是不幸的。因此,我們的目標是建立一個能夠幫助使用者寫出更好問題的輔助工具。
試圖透過機器學習實作端對端框架
在這種情況下,端對端意味著使用單一模型從輸入直接到輸出,中間沒有任何步驟。由於大多數產品目標非常具體,嘗試透過端對端學習來解決整個使用案例往往需要自定義的尖端機器學習模型。這可能是擁有足夠資源來開發和維護這類別模型的團隊的最佳解決方案,但通常值得先從更成熟的模型開始。
在我們的案例中,我們可以嘗試收集一組寫得不好的問題及其專業編輯版本的資料集。然後,我們可以使用生成模型直接從一個文字轉換到另一個。
圖表說明:端對端方法
此圖示展示了一個簡單的圖表,使用者輸入在左側,期望輸出在右側,中間是一個模型。 圖表翻譯: 此圖表示了一個端對端的處理流程,從使用者輸入到期望輸出的直接轉換,中間透過一個機器學習模型進行處理。
這種方法面臨著多個挑戰:
資料:要獲得這樣的資料集,我們需要找到具有相同意圖但措辭品質不同的問題對。這類別資料集相當稀有,自行構建將非常昂貴,因為我們需要專業編輯的協助來生成這些資料。
模型:從一種文字序列轉換到另一種的模型,在近年來已經取得了巨大的進步。序列到序列模型最初是在2014年為翻譯任務提出的,目前正在縮小機器翻譯和人類翻譯之間的差距。然而,這些模型的成功主要是在句子級任務上,它們很少被用來處理長於一段文字的文字。這是因為到目前為止,它們還無法捕捉從一段文字到另一段文字的長期上下文。此外,由於它們通常具有大量的引數,它們是訓練速度最慢的模型之一。如果一個模型只需要訓練一次,這不是問題。但如果需要每小時或每天重新訓練,訓練時間就會成為一個重要因素。
延遲:序列到序列模型通常是自迴歸模型,這意味著它們需要前一個詞的輸出來開始處理下一個詞。這使它們能夠利用鄰近詞的資訊,但導致它們訓練和推理速度都比更簡單的模型慢。這類別模型在推理時可能需要幾秒鐘才能產生答案,而更簡單的模型則可以實作亞秒級延遲。雖然可以最佳化這類別模型以執行得足夠快,但這需要額外的工程工作。