不管怎樣,機器學習都是關于不確定性的。在監督學習中,我們希望在給定已知事物(特征)的情況下預測未知事物(目標)。根據我們的目標,我們可能會嘗試預測目標的最可能值。或者我們可以預測與目標的預期距離最小的值。有時我們不僅希望預測特定值,而且希望量化我們的不確定性。例如,給定一些描述患者的特征,我們可能想知道有多大可能他們將在明年心臟病發作。在無監督學習中,我們經常關心不確定性。要確定一組測量值是否異常,了解一個人在感興趣的總體中觀察值的可能性有多大是有幫助的。此外,在強化學習中,我們希望開發能夠在各種環境中智能行動的智能體。這需要推理環境可能會如何變化,以及人們可能期望在響應每個可用操作時遇到什么獎勵。
概率是與不確定性推理有關的數學領域。給定某個過程的概率模型,我們可以推斷各種事件的可能性。使用概率來描述可重復事件(如拋硬幣)的頻率是相當沒有爭議的。事實上,頻率論學者堅持只適用于此類可重復事件的概率解釋。相比之下,貝葉斯學者更廣泛地使用概率語言來形式化我們在不確定性下的推理。貝葉斯概率具有兩個獨特的特征:(i) 將置信度分配給不可重復的事件,例如,概率是 多少月亮是奶酪做的?(ii) 主觀性——雖然貝葉斯概率為人們應該如何根據新證據更新他們的信念提供了明確的規則,但它允許不同的個體以不同的先驗信念開始。 統計數據幫助我們向后推理,從收集和組織數據開始,然后退回到我們可能對生成數據的過程得出的推論。每當我們分析數據集,尋找我們希望可以表征更廣泛人群的模式時,我們都在運用統計思維。大多數課程、專業、論文、職業、部門、公司和機構都致力于研究概率和統計。雖然本節僅涉及表面,但我們將為您提供開始構建模型所需的基礎。
%matplotlib inline
import random
import torch
from torch.distributions.multinomial import Multinomial
from d2l import torch as d2l
%matplotlib inline
import random
import tensorflow as tf
from tensorflow_probability import distributions as tfd
from d2l import tensorflow as d2l
2.6.1. 一個簡單的例子:拋硬幣
想象一下,我們計劃拋硬幣并想要量化我們看到正面(與反面)的可能性有多大。如果硬幣是公平的,那么兩種結果(正面和反面)的可能性都相同。此外,如果我們打算拋硬幣n次,那么我們期望看到的正面部分應該與預期的反面部分完全匹配。一種直觀的方式是通過對稱性來看待這一點:對于每一個可能的結果nh 頭和nt=(n?nh)尾巴,有一個同樣可能的結果nt頭和nh尾巴。請注意,這只有在我們平均期望看到的情況下才有可能1/2拋出頭和1/2出現尾巴。當然,如果你多次進行這個實驗n=1000000拋擲每一個,你可能永遠看不到試驗在哪里nh=nt確切地。
形式上,數量1/2被稱為概率,在這里它捕捉到任何給定的拋擲都會出現正面的確定性。概率在之間分配分數0和1到感興趣的結果,稱為事件。這里感興趣的事件是 heads我們表示相應的概率 P(heads). 的概率1表示絕對確定性(想象一個雙面都是正面的騙局硬幣)和概率0表示不可能(例如,如果兩邊都是反面)。頻率nh/n和nt/n不是概率而是統計。概率是 數據生成過程的理論量。在這里,概率1/2是硬幣本身的屬性。相比之下,統計數據是作為觀察數據的函數計算的經驗量。我們對概率和統計量的興趣密不可分。我們經常設計稱為估計器的特殊統計數據,在給定數據集的情況下,它會產生 模型參數(如概率)的估計值。此外,當這些估計量滿足稱為一致性的良好屬性時,我們的估計將收斂到相應的概率。反過來,這些推斷的概率說明了我們將來可能遇到的來自同一人群的數據的可能統計特性。
假設我們偶然發現了一枚真實的硬幣,但我們并不知道它的真實價值P(heads). 要用統計方法調查這個數量,我們需要(i)收集一些數據;(ii) 設計一個估算器。這里的數據采集很容易;我們可以多次拋硬幣并記錄所有結果。形式上,從一些底層隨機過程中繪制實現稱為采樣。正如您可能已經猜到的那樣,一種自然的估計量是觀察到的正面朝上數與拋擲總次數之間的分數。
現在,假設硬幣實際上是公平的,即 P(heads)=0.5. 為了模擬公平硬幣的拋擲,我們可以調用任何隨機數生成器。以概率抽取事件樣本的一些簡單方法0.5. 例如 Python random.random
在區間內產生數字[0,1]其中躺在任何子區間的概率[a,b]?[0,1]等于b?a. 因此我們可以通過0
測試返回的1
浮點數0.5
是否大于0.5
num_tosses = 100
heads = sum([random.random() > 0.5 for _ in range(100)])
tails = num_tosses - heads
print("heads, tails: ", [heads, tails])
heads, tails: [48, 52]
num_tosses = 100
heads = sum([random
評論