機器學習中的“學習”到底是個啥?
人工智能的發(fā)展經(jīng)歷了數(shù)次高潮和低谷,以2016年AlphaGo對戰(zhàn)圍棋大師李世石為標志性事件,再一次將人工智能推上一波全新的高潮。這一波AI高峰是一種稱為深度學習的技術(shù)推動而來的,深度學習是機器學習的一個子集,它幾乎影響了每一個領(lǐng)域和每一個人,那么機器學習中的學習到底是什么呢?
我剛開始了解到這個詞的時候,直覺是機器學習和人類學習是類似的,機器竟然已經(jīng)強大到可以像人類一樣學習了,向來不自信的我就覺得這哪是我能學會的技術(shù)呢!可以說機器學習這個術(shù)語嚇住了我,讓我不敢嘗試去進一步學習它的技術(shù)原理,直到很久以后才慢慢對它有了了解。因此我個人是不太喜歡這個詞的,不知道是不是有人和我同樣的原因放棄或延緩了進一步學習AI的知識。剛好最近學習《深度學習與圍棋》第10章發(fā)現(xiàn)有一個簡單的例子非常適合直觀展示到底什么是機器學習中的學習,大家來體會體會。
策略學習與演示
這個例子演示如何讓一個程序不斷進行策略學習來贏得一個叫做“加加加”的游戲,其實就是個數(shù)字游戲,下面是它的游戲規(guī)則:
- 每一回合每人選擇一個1~5的數(shù)字;
- 在100回合后,每個人將他們所選擇的數(shù)字加起來;
- 總和最高的人獲勝。
很顯然,每個回合選擇數(shù)字5就是最佳策略,書中之所以選擇這么簡單的游戲,就是為方便展示策略學習,觀察程序如何逐步學習到這個最佳的策略的。
首先,下面的python代碼用來模擬一局“加加加”游戲,傳入的參數(shù)policy是選擇各個數(shù)字的概率列表,返回值為100回合后勝者和負者所選擇的數(shù)字次數(shù)統(tǒng)計。
import numpy as np
def simulate_game(policy):
"""
模擬加加加游戲,游戲介紹:
1. 兩個玩家每一回合每人選擇一個1~5的數(shù)字;
2. 在100回合之后,每個人將他們選擇的數(shù)字加起來;
3. 總和最高的人獲勝。
返回值:(勝者的選擇,負者的選擇)
"""
# 記錄玩家選擇數(shù)字1~5的次數(shù)
player_1_choices = {1: 0, 2: 0, 3: 0, 4: 0, 5: 0}
# 記錄玩家選擇數(shù)字的總數(shù)
player_1_total = 0
player_2_choices = {1: 0, 2: 0, 3: 0, 4: 0, 5: 0}
player_2_total = 0
# 運行100回合
for i in range(100):
# 按照policy指定的概率選擇1~5中的數(shù)字
player_1_choice = np.random.choice([1, 2, 3, 4, 5], p=policy)
player_1_choices[player_1_choice] += 1
player_1_total += player_1_choice
player_2_choice = np.random.choice([1, 2, 3, 4, 5], p=policy)
player_2_choices[player_2_choice] += 1
player_2_total += player_2_choice
if player_1_total > player_2_total:
winner_choices = player_1_choices
loser_choices = player_2_choices
else:
winner_choices = player_2_choices
loser_choices = player_1_choices
return (winner_choices, loser_choices)
接下來就持續(xù)模擬游戲,初始策略是所有的數(shù)字選擇概率都是相同的,為20%,每模擬一局游戲,就將勝利者選擇數(shù)字的概率增加一點,而失敗者選擇數(shù)字的概率減少一點,這個更新選擇數(shù)字概率的過程就是“學習”。下面的代碼模擬了3000局游戲,并將策略的變化繪制成了曲線。
# 歸一化處理選擇策略
def normalize(policy):
# <0的變?yōu)?,大于1的變?yōu)?,將所有的policy的值限制在0-1范圍內(nèi)
policy = np.clip(policy, 0, 1)
# 歸一化處理,使得所有概率的總和為1
return policy / np.sum(policy)
# 要選擇的數(shù)字列表
choices = [1, 2, 3, 4, 5]
# 初始選擇數(shù)字的策略,每個數(shù)字的選擇概率都是20%
policy = np.array([0.2, 0.2, 0.2, 0.2, 0.2])
# 學習率,主要是為了控制策略變化的快慢
learning_rate = 0.0001
# 模擬游戲的局數(shù)
num_games = 3000
result = []
# 模擬多局游戲
for i in range(num_games):
# 模擬一局游戲(100個回合)
win_counts, lose_counts = simulate_game(policy)
# 遍歷每一個要選擇的數(shù)字
for j, choice in enumerate(choices):
# 計算本局勝利者選擇數(shù)字的次數(shù)-失敗者選擇此數(shù)字的次數(shù),表示勝者和負者的偏差
net_wins = win_counts[choice] - lose_counts[choice]
# 將選擇此數(shù)字的概率根據(jù)偏差*學習率增加或減少
# 為負表明勝者傾向于少選擇此數(shù)字,為正表明勝者傾向于多選擇此數(shù)字
# ===注意這里就是在進行策略的學習===
policy[j] += learning_rate * net_wins
# 概率歸一化處置
policy = normalize(policy)
# 記錄局數(shù)、更新后的策略值
result.append((i, policy))
print(f"{i}: {policy}")
# 繪制策略的變化變化曲線
x = [i[0] for i in result]
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 設(shè)置中文字體為黑體
plt.rcParams['axes.unicode_minus'] = False # 正確顯示負號
for i in range(5):
plt.plot(x, [c[1][i] for c in result], label=f"選擇數(shù)字{i + 1}的概率")
plt.grid(True)
plt.legend(loc="right")
plt.title("加加加游戲策略變化曲線")
plt.show()
下圖就是3000局游戲中選擇數(shù)字策略的變化曲線,從圖中可以看出大概2000局之后,程序就學到了最佳策略,即每次都選擇數(shù)字5,也就是說程序自主學會了怎么在“加加加”游戲中獲勝。深度學習要比這個例子復(fù)雜的多,但是機器學習的本質(zhì)都是一樣的,都是通過某些手段去調(diào)節(jié)參數(shù)以達到解決問題的目的。
圖片
機器學習:一種創(chuàng)新的編程范式
在傳統(tǒng)的編程實踐中,我們通過精心設(shè)計的算法和邏輯來直接解決問題。這種方式要求程序員對問題有深入的理解,并且能夠?qū)⒔鉀Q方案明確地編碼到程序中。然而,機器學習提供了一種全新的視角,它不是直接針對問題本身,而是將問題轉(zhuǎn)化為數(shù)學模型,然后利用數(shù)據(jù)來訓練模型,使其能夠自動學習和找到解決問題的方法。
這種范式轉(zhuǎn)變帶來了幾個關(guān)鍵的思維創(chuàng)新:
- 抽象和泛化:機器學習將具體問題抽象為數(shù)學模型,這使得模型能夠在不同情境下泛化,解決更廣泛的問題。
- 數(shù)據(jù)驅(qū)動的決策:在機器學習中,決策過程是基于數(shù)據(jù)的,模型通過分析大量數(shù)據(jù)來學習如何做出預(yù)測或決策。
- 自動化的特征工程:傳統(tǒng)編程中,特征提取和工程通常需要領(lǐng)域?qū)<业纳钊雲(yún)⑴c。機器學習,尤其是深度學習,能夠自動從原始數(shù)據(jù)中學習特征,減少了對專家知識的依賴。
- 迭代和自適應(yīng):機器學習模型可以通過迭代訓練過程不斷優(yōu)化,它們能夠適應(yīng)新的數(shù)據(jù)和變化的環(huán)境。
- 跨領(lǐng)域的應(yīng)用:機器學習的方法論可以應(yīng)用于各種領(lǐng)域,從圖像識別到自然語言處理,從醫(yī)療診斷到股票市場分析,其應(yīng)用范圍廣泛。
將機器學習視為一種編程范式,有助于我們更好地理解其核心價值和潛力。它不僅僅是一系列算法和技術(shù)的集合,更是一種全新的思考和解決問題的方式。這種思維方式的創(chuàng)新為解決復(fù)雜問題提供了新的可能性,并且正在不斷推動科技和社會的進步。