# 理解線性回歸中的損失函數
了解損失函數在算法收斂中的作用非常重要。在這里,我們將說明 L1 和 L2 損失函數如何影響線性回歸中的收斂。
## 做好準備
我們將使用與先前秘籍中相同的虹膜數據集,但我們將更改損失函數和學習率以查看收斂如何變化。
## 操作步驟
我們按如下方式處理秘籍:
1. 程序的開始與上一個秘籍相同,直到我們達到我們的損失函數。我們加載必要的庫,啟動會話,加載數據,創建占位符,并定義我們的變量和模型。需要注意的一點是,我們正在提取學習率和模型迭代。我們這樣做是因為我們希望顯示快速更改這些參數的效果。使用以下代碼:
```py
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
from sklearn import datasets
sess = tf.Session()
iris = datasets.load_iris()
x_vals = np.array([x[3] for x in iris.data])
y_vals = np.array([y[0] for y in iris.data])
batch_size = 25
learning_rate = 0.1 # Will not converge with learning rate at 0.4
iterations = 50
x_data = tf.placeholder(shape=[None, 1], dtype=tf.float32)
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)
A = tf.Variable(tf.random_normal(shape=[1,1]))
b = tf.Variable(tf.random_normal(shape=[1,1]))
model_output = tf.add(tf.matmul(x_data, A), b)
```
1. 我們的損失函數將變為 L1 損失(`loss_l1`),如下所示:
```py
loss_l1 = tf.reduce_mean(tf.abs(y_target - model_output))
```
1. 現在,我們通過初始化變量,聲明我們的優化器以及通過訓練循環迭代數據來恢復。請注意,我們也在節省每一代的損失來衡量收斂。使用以下代碼:
```py
init = tf.global_variables_initializer()
sess.run(init)
my_opt_l1 = tf.train.GradientDescentOptimizer(learning_rate)
train_step_l1 = my_opt_l1.minimize(loss_l1)
loss_vec_l1 = []
for i in range(iterations):
rand_index = np.random.choice(len(x_vals), size=batch_size)
rand_x = np.transpose([x_vals[rand_index]])
rand_y = np.transpose([y_vals[rand_index]])
sess.run(train_step_l1, feed_dict={x_data: rand_x, y_target: rand_y})
temp_loss_l1 = sess.run(loss_l1, feed_dict={x_data: rand_x, y_target: rand_y})
loss_vec_l1.append(temp_loss_l1)
if (i+1)%25==0:
print('Step #' + str(i+1) + ' A = ' + str(sess.run(A)) + ' b = ' + str(sess.run(b)))
plt.plot(loss_vec_l1, 'k-', label='L1 Loss')
plt.plot(loss_vec_l2, 'r--', label='L2 Loss')
plt.title('L1 and L2 Loss per Generation')
plt.xlabel('Generation')
plt.ylabel('L1 Loss')
plt.legend(loc='upper right')
plt.show()
```
## 工作原理
在選擇損失函數時,我們還必須選擇適合我們問題的相應學習率。在這里,我們將說明兩種情況,一種是首選 L2,另一種是首選 L1。
如果我們的學習率很小,我們的收斂會花費更多時間。但是如果我們的學習速度太大,我們的算法就會遇到問題從不收斂。下面是當學習率為 0.05 時,虹膜線性回歸問題的 L1 和 L2 損失的損失函數圖:

圖 5:虹膜線性回歸問題的學習率為 0.05 的 L1 和 L2 損失
學習率為 0.05 時,似乎 L2 損失是首選,因為它會收斂到較低的損失。下面是我們將學習率提高到 0.4 時的損失函數圖:

圖 6:虹膜線性回歸問題的 L1 和 L2 損失,學習率為 0.4;請注意,由于 y 軸的高比例,L1 損失不可見
在這里,我們可以看到高學習率可以在 L2 范數中超調,而 L1 范數收斂。
## 更多
為了理解正在發生的事情,我們應該看看大學習率和小學習率如何影響 L1 規范和 L2 規范。為了使這個可視化,我們查看兩個規范的學習步驟的一維表示,如下所示:

圖 7:學習率越來越高的 L1 和 L2 規范會發生什么
- TensorFlow 入門
- 介紹
- TensorFlow 如何工作
- 聲明變量和張量
- 使用占位符和變量
- 使用矩陣
- 聲明操作符
- 實現激活函數
- 使用數據源
- 其他資源
- TensorFlow 的方式
- 介紹
- 計算圖中的操作
- 對嵌套操作分層
- 使用多個層
- 實現損失函數
- 實現反向傳播
- 使用批量和隨機訓練
- 把所有東西結合在一起
- 評估模型
- 線性回歸
- 介紹
- 使用矩陣逆方法
- 實現分解方法
- 學習 TensorFlow 線性回歸方法
- 理解線性回歸中的損失函數
- 實現 deming 回歸
- 實現套索和嶺回歸
- 實現彈性網絡回歸
- 實現邏輯回歸
- 支持向量機
- 介紹
- 使用線性 SVM
- 簡化為線性回歸
- 在 TensorFlow 中使用內核
- 實現非線性 SVM
- 實現多類 SVM
- 最近鄰方法
- 介紹
- 使用最近鄰
- 使用基于文本的距離
- 使用混合距離函數的計算
- 使用地址匹配的示例
- 使用最近鄰進行圖像識別
- 神經網絡
- 介紹
- 實現操作門
- 使用門和激活函數
- 實現單層神經網絡
- 實現不同的層
- 使用多層神經網絡
- 改進線性模型的預測
- 學習玩井字棋
- 自然語言處理
- 介紹
- 使用詞袋嵌入
- 實現 TF-IDF
- 使用 Skip-Gram 嵌入
- 使用 CBOW 嵌入
- 使用 word2vec 進行預測
- 使用 doc2vec 進行情緒分析
- 卷積神經網絡
- 介紹
- 實現簡單的 CNN
- 實現先進的 CNN
- 重新訓練現有的 CNN 模型
- 應用 StyleNet 和 NeuralStyle 項目
- 實現 DeepDream
- 循環神經網絡
- 介紹
- 為垃圾郵件預測實現 RNN
- 實現 LSTM 模型
- 堆疊多個 LSTM 層
- 創建序列到序列模型
- 訓練 Siamese RNN 相似性度量
- 將 TensorFlow 投入生產
- 介紹
- 實現單元測試
- 使用多個執行程序
- 并行化 TensorFlow
- 將 TensorFlow 投入生產
- 生產環境 TensorFlow 的一個例子
- 使用 TensorFlow 服務
- 更多 TensorFlow
- 介紹
- 可視化 TensorBoard 中的圖
- 使用遺傳算法
- 使用 k 均值聚類
- 求解常微分方程組
- 使用隨機森林
- 使用 TensorFlow 和 Keras