前言
本文隸屬于專欄《機器學習數學通關指南》,該專欄為筆者原創,引用請注明來源,不足和錯誤之處請在評論區幫忙指出,謝謝!
本專欄目錄結構和參考文獻請見《機器學習數學通關指南》
ima 知識庫
知識庫廣場搜索:
知識庫 | 創建人 |
---|---|
機器學習 | @Shockang |
機器學習數學基礎 | @Shockang |
深度學習 | @Shockang |
正文
📚 引言
熵和交叉熵是機器學習和信息論中的基礎概念,它們在模型優化、信息壓縮和不確定性量化中扮演著核心角色。本文將系統地分析這兩個概念,從理論到實踐,幫助您構建完整的理解框架。
🔄 熵 (Entropy)
📝 定義
熵源于信息論,用于量化隨機變量的不確定性或信息量。對于一個隨機變量 X X X 的概率分布 P P P:
H ( P ) = ? ∑ i = 1 n p i log ? 2 p i H(P) = -\sum_{i=1}^{n} p_i \log_2 p_i H(P)=?i=1∑n?pi?log2?pi?
其中 p i p_i pi? 是事件 i i i 發生的概率。單位通常是比特(bit)(使用以2為底的對數時)。
🔑 核心特性
- 非負性:熵始終 ≥ 0 \geq 0 ≥0
- 最大熵原理:均勻分布時熵最大
- 最小熵原理:確定事件(概率為1)時熵為0
- 加性:獨立隨機變量的聯合熵等于各自熵之和
📊 直觀理解
熵可以理解為平均信息量或平均驚訝度:
- 高熵:事件發生很"意外",需要更多信息來描述系統
- 低熵:事件發生很"平常",需要較少信息來描述系統
🌟 應用場景
- 決策樹算法:通過信息增益(熵的減少)選擇最優特征
- 數據壓縮:信息熵決定了數據壓縮的極限(香農極限)
- 密碼學:評估密碼的安全強度
- 特征選擇:選擇包含最多信息的特征
💻 Python代碼實現
import numpy as npdef entropy(probabilities):"""計算信息熵"""# 過濾掉零概率(避免log(0))probabilities = np.array(probabilities)probabilities = probabilities[probabilities > 0]return -np.sum(probabilities * np.log2(probabilities))# 例子1: 均勻分布 [0.5, 0.5]
print(f"均勻二項分布的熵: {entropy([0.5, 0.5])}") # 結果為1,即最大熵# 例子2: 確定事件 [1, 0]
print(f"確定事件的熵: {entropy([1, 0])}") # 結果為0,即最小熵# 例子3: 偏斜分布 [0.9, 0.1]
print(f"偏斜分布的熵: {entropy([0.9, 0.1])}") # 結果約為0.469,熵較低
? 交叉熵 (Cross-Entropy)
📝 定義
交叉熵用于衡量兩個概率分布的差異,特別是真實分布 P P P 和預測/估計分布 Q Q Q 之間的差異:
H ( P , Q ) = ? ∑ i = 1 n p i log ? 2 q i H(P, Q) = -\sum_{i=1}^{n} p_i \log_2 q_i H(P,Q)=?i=1∑n?pi?log2?qi?
🔍 與熵的關系
- 當 P = Q P = Q P=Q 時, H ( P , Q ) = H ( P ) H(P, Q) = H(P) H(P,Q)=H(P)
- 一般情況下, H ( P , Q ) ≥ H ( P ) H(P, Q) \geq H(P) H(P,Q)≥H(P)(信息不等式)
- 交叉熵 = 熵 + KL散度: H ( P , Q ) = H ( P ) + D K L ( P ∣ ∣ Q ) H(P, Q) = H(P) + D_{KL}(P || Q) H(P,Q)=H(P)+DKL?(P∣∣Q)
🚀 作為損失函數的優勢
- 梯度穩定性:相比均方誤差,避免了梯度消失問題
- 概率解釋性:直接對應最大似然估計
- 對錯誤預測的高懲罰:預測值遠離真實值時懲罰顯著增加
💻 Python代碼實現
import numpy as np
import matplotlib.pyplot as pltdef cross_entropy(y_true, y_pred):"""計算交叉熵"""# 防止數值不穩定y_pred = np.clip(y_pred, 1e-15, 1 - 1e-15)return -np.sum(y_true * np.log2(y_pred))# 二分類示例
y_true = np.array([1, 0]) # 真實標簽:第一個類為正例# 不同預測概率的交叉熵
predictions = np.linspace(0.1, 0.9, 9)
ce_values = []for pred in predictions:y_pred = np.array([pred, 1-pred]) # 預測概率ce_values.append(cross_entropy(y_true, y_pred))print(f"預測概率為[{pred:.1f}, {1-pred:.1f}]時,交叉熵為: {ce_values[-1]:.3f}")# 可視化交叉熵隨預測概率變化
plt.figure(figsize=(10, 6))
plt.plot(predictions, ce_values, 'b-o', linewidth=2)
plt.axvline(x=1.0, color='g', linestyle='--', label='理想預測')
plt.xlabel('預測正例的概率')
plt.ylabel('交叉熵')
plt.title('交叉熵隨預測概率的變化')
plt.grid(True)
plt.show()
📊 實際應用比較
熵與交叉熵的區別
特征 | 熵 | 交叉熵 |
---|---|---|
對象 | 單個概率分布的不確定性 | 兩個分布的差異性 |
適用場景 | 信息量度量、特征選擇 | 模型訓練損失函數 |
最小值 | 確定事件(某事件概率=1)時為0 | 當預測分布=真實分布時取最小值 |
數學表達 | ? ∑ p i log ? p i -\sum p_i \log p_i ?∑pi?logpi? | ? ∑ p i log ? q i -\sum p_i \log q_i ?∑pi?logqi? |
對稱性 | 不涉及(僅一個分布) | 非對稱性( H ( P , Q ) ≠ H ( Q , P ) H(P, Q) \neq H(Q, P) H(P,Q)=H(Q,P)) |
🛠? 實踐應用
1. 決策樹中的信息增益
# 計算信息增益
def information_gain(parent_entropy, feature_values, target_values):# 計算特征各取值的條件熵child_entropies = []weights = []unique_values = np.unique(feature_values)total_samples = len(target_values)for value in unique_values:indices = np.where(feature_values == value)[0]target_subset = target_values[indices]# 計算子集中不同類別的概率分布unique_targets = np.unique(target_subset)probs = [np.sum(target_subset == t) / len(target_subset) for t in unique_targets]# 計算條件熵child_entropy = entropy(probs)child_entropies.append(child_entropy)weights.append(len(indices) / total_samples)# 計算條件熵的加權平均conditional_entropy = np.sum(np.array(weights) * np.array(child_entropies))# 信息增益 = 父節點熵 - 條件熵return parent_entropy - conditional_entropy
2. 神經網絡分類訓練
# 基于TensorFlow/Keras的交叉熵損失示例
import tensorflow as tf
from tensorflow import keras
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split# 生成模擬數據
X, y = make_classification(n_samples=1000, n_classes=3, n_features=20, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 將類別轉換為one-hot編碼
y_train_onehot = keras.utils.to_categorical(y_train, 3)
y_test_onehot = keras.utils.to_categorical(y_test, 3)# 構建簡單神經網絡
model = keras.Sequential([keras.layers.Dense(64, activation='relu', input_shape=(20,)),keras.layers.Dense(32, activation='relu'),keras.layers.Dense(3, activation='softmax') # 3個輸出類別
])# 使用交叉熵作為損失函數
model.compile(optimizer='adam',loss='categorical_crossentropy', # 多分類交叉熵metrics=['accuracy']
)# 訓練模型
history = model.fit(X_train, y_train_onehot, epochs=10, validation_split=0.2, verbose=0)# 評估模型
test_loss, test_acc = model.evaluate(X_test, y_test_onehot)
print(f"測試精度: {test_acc:.4f}")
print(f"測試交叉熵損失: {test_loss:.4f}")
🔮 高級話題
1. 最大熵原理
最大熵原理是一種推斷方法,當我們對未知分布只有部分信息時,應該選擇滿足已知條件下熵最大的分布,這樣可以避免引入額外的不必要假設。
2. 信息瓶頸理論
信息瓶頸理論(Information Bottleneck Theory)是一種解釋深度學習的理論框架,認為深度學習的目標是找到輸入數據的一種表示,該表示:
- 盡可能多地保留與目標相關的信息
- 盡可能壓縮輸入的原始信息
3. 可變長度編碼
熵確定了信息的最優編碼長度。哈夫曼編碼等算法利用了這一原理,為頻率高的符號分配短碼,頻率低的符號分配長碼。
🎯 小結
- 熵是量化單一分布不確定性的基礎度量
- 交叉熵衡量兩個分布的差異,是機器學習中常用的損失函數
- 理解這兩個概念有助于理解信息論和機器學習中的許多算法和技術
- 實際應用中,交叉熵損失函數在分類任務中表現優異,尤其是對于概率預測問題
📖 延伸閱讀
- 香農的信息論原始論文
- KL散度及其在變分推斷中的應用
- 最大熵模型與其在自然語言處理中的應用
- 互信息與特征選擇
- 深度學習中的信息瓶頸理論
希望這篇文章能幫助你理解熵和交叉熵這兩個重要概念。在機器學習的旅途中,掌握這些基礎數學工具將使你事半功倍!🚀