【強基固本】基礎算法:使用numpy實現邏輯回歸隨機梯度下降(附代碼)

2021-03-02 人工智慧前沿講習

深度學習算法工程師面試,記錄一道較為基礎的筆試題:

輸入:目標向量Y(N*1),矩陣X(N*K);輸出:使用隨機梯度下降求得的邏輯回歸係數W(K+1)。

分析:該問題需要先列出邏輯回歸的函數解析式,再選擇損失函數,最後算出損失函數關於更新參數的導數,即可開始隨機梯度下降。

地址:https://www.zhihu.com/people/thisiszhou

01

邏輯回歸解析式

02

Loss函數

由於邏輯回歸的輸出值在[0, 1]之間,並且邏輯回歸雖然名字為回歸,但實際是分類任務,所以損失函數使用交叉熵。其中交叉熵函數解析式為:

03

關於更新參數的導數

更新參數有  ,b,Loss的解析式為:
為了便於求導,我們換一種寫法,其中sum函數相當於給後面的列向量乘一個都為1的行向量S:其中  為矩陣乘法,CE和  都是逐元素函數,則:(其中  為逐元素乘法,在最後的計算中,逐元素乘法優先級比矩陣乘法優先級高)

04

參數更新(梯度下降)

其中  為學習率。

05

代碼實現

import numpy as npfrom random import shuffle
def sigmoid(x): return 1 / (1 + np.exp(-x))

def ce(y, y_label): return -y_label*np.log(y) - (1-y_label)*np.log(1-y)

def ce_grad(y, y_label): return -y_label/y + (1-y_label)/(1-y)

np.random.seed(32)  n = 6k = 7X = np.random.rand(n,k) y_label = np.random.randint(0,2,size=(n,1)).astype(np.float32)w = np.random.rand(k,1)b = np.random.rand(1,1)

def forward(X, w, b):    y1 = np.dot(X, w) + b    y2 = sigmoid(y1)    y3 = ce(y2,y_label)    loss = sum(y3)    return y1, y2, y3, loss

def gradients(y1, y2, y3, X, y_label):    grad1 = np.ones(len(y3))    grad2 = ce_grad(y2, y_label)    grad3 = sigmoid(y1)*(1-sigmoid(y1))    grad4_w = X    grad4_b = 1    return (        np.dot(grad1, grad2*grad3*grad4_w),        np.dot(grad1, grad2*grad3*grad4_b)    )

array([2.34286961, 2.97101168, 1.98692618, 1.81275096, 2.52826215,       2.42595535, 1.9706045 ])

import tensorflow as tf
def ce(y, y_label):    return -y_label*tf.log(y) - (1-y_label)*tf.log(1-y)    X = tf.Variable(X)w = tf.Variable(w)b = tf.Variable(b)
y1 = tf.matmul(X, w) + by2 = tf.sigmoid(y1)y3 = ce(y2, y_label)loss = tf.reduce_sum(y3)grad = tf.gradients(loss, w)with tf.Session() as sess: sess.run(tf.global_variables_initializer()) ret = sess.run(grad)

array([[2.34286961],        [2.97101168],        [1.98692618],        [1.81275096],        [2.52826215],        [2.42595535],        [1.9706045 ]])

使用隨機梯度下降進行參數更新。隨機梯度下降,一般會隨機選擇batch,這裡為了簡便,直接將所有向量進行BP:

yita = 1e-2train_num = 10000for i in range(train_num):    y1, y2, y3, loss = forward(X, w, b)    g_w, g_b = gradients(y1, y2, y3, X, y_label)    w -= yita*g_w.reshape([-1, 1])    b -= yita*g_b    if i % 1000 == 0:        print("loss:", loss)

loss: [11.6081676]loss: [1.18844796]loss: [0.71728752]loss: [0.49936237]loss: [0.37872785]loss: [0.30340733]loss: [0.25233963]loss: [0.21561081]loss: [0.18800623]loss: [0.16654284]

>>> forward(X, w, b)[1]array([[0.01485668],       [0.00538101],       [0.01436137],       [0.01684294],       [0.0247247 ],       [0.93002105]])

>>> y_labelarray([[0.],       [0.],       [0.],       [0.],       [0.],       [1.]], dtype=float32)

06

總結

BP過程相對基礎,但確實不是很簡單。例如,此題loss關於w的導數,是典型的標量關於向量求導。關於向量、矩陣的求導,推薦以下文章:
https://zhuanlan.zhihu.com/p/24709748

本文目的在於學術交流,並不代表本公眾號贊同其觀點或對其內容真實性負責,版權歸原作者所有,如有侵權請告知刪除。


相關焦點

  • 機器學習之多元線性回歸模型梯度下降公式與代碼實現(篇二)
    上一篇我們介紹了線性回歸的概述和最小二乘的介紹,對簡單的一元線性方程模型手推了公式和python代碼的實現。機器學習之線性回歸模型詳細手推公式與代碼實現(篇一)今天這一篇來介紹多元線性回歸模型多元線性回歸模型介紹在回歸分析中,如果有兩個或兩個以上的自變量,就稱為多元回歸
  • 從頭開始:用Python實現帶隨機梯度下降的Logistic回歸
    logistic 回歸是一種著名的二元分類問題的線性分類算法。它容易實現、易於理解,並在各類問題上有不錯的效果,即使該方法的原假設與數據有違背時。在本教程中,你將了解如何在 Python 中實現隨機梯度下降的 logistic 回歸算法。
  • 梯度下降—Python實現
    梯度下降是數據科學的基礎,無論是深度學習還是機器學習。深入了解梯度下降原理一定會對你今後的工作有所幫助。你將真正了解這些超參數的作用以及處理使用此算法可能遇到的問題。然而,梯度下降並不局限於一種算法。另外兩種流行的梯度下降(隨機和小批量梯度下降)建立在主要算法的基礎上,你可能會看到比普通批量梯度下降更多的算法。
  • Python機器學習算法入門之梯度下降法實現線性回歸
    3.1 python實現最小二乘法        這裡的代碼僅僅針對背景裡的這個問題。部分參考了回歸方法及其python實現。An Introduction to Gradient Descent and Linear Regression提供了完整的實現代碼GradientDescentExample。        這裡多插入一句,如何在python中生成GIF動圖。配置的過程參考了使用Matplotlib和Imagemagick實現算法可視化與GIF導出。
  • 線性回歸的求解:矩陣方程和梯度下降、數學推導及NumPy實現
    梯度下降法求解損失函數最小問題,或者說求解使損失函數最小的最優化問題時,經常使用搜索的方法。具體而言,選擇一個初始點作為起點,然後開始不斷搜索,損失函數逐漸變小,當到達搜索迭代的結束條件時,該位置為搜索算法的最終結果。
  • [基礎算法]邏輯回歸:一個簡單卻又不失深度的經典算法[關鍵點梳理+代碼實踐]
    Logistic Regression是統計學習中的經典分類算法,雖然被稱為回歸,但其實際上是分類模型,並常用於二分類。因其模型結構簡單、可並行化、可解釋強的特點深受工業界喜愛。即使用MSE作為Loss時,梯度傳播公式會受到sigmoid函數梯度的影響,出現梯度消失現象,不利於訓練。而使用交叉熵(對數似然)時,梯度不存在這種情況。
  • 教程 從頭開始:如何用 Python 實現帶隨機梯度下降的線性回歸
    優化算法用於在機器學習中為給定訓練集找出合理的模型參數設置。機器學習最常見的優化算法是隨機梯度下降(SGD:stochastic gradient descent)。本教程將指導大家用 Python 實現隨機梯度下降對線性回歸算法的優化。
  • 機器學習算法基礎(使用Python代碼)
    監督學習的例子:回歸,決策樹,隨機森林,KNN,邏輯回歸等。2.無監督學習工作原理:在此算法中,我們沒有任何目標或結果變量來進行預測/估計。它用於將人群進行聚類到不同群體中,廣泛用於將客戶劃分到不同的群體中去並進行具體的幹預。無監督學習的例子:Apriori算法,K-means。
  • 教程 從頭開始:用Python實現帶隨機梯度下降的線性回歸
    優化算法用於在機器學習中為給定訓練集找出合理的模型參數設置。機器學習最常見的優化算法是隨機梯度下降(SGD:stochastic gradient descent)。本教程將指導大家用 Python 實現隨機梯度下降對線性回歸算法的優化。
  • 【強基固本】卷積神經網絡(CNN)反向傳播算法
    「強基固本,行穩致遠」,科學研究離不開理論基礎,人工智慧學科更是需要數學、物理、神經科學等基礎學科提供有力支撐,為了緊扣時代脈搏,我們推出「強基固本
  • 用Python實現機器學習算法:邏輯回歸
    為什麼不用線性回歸的代價函數表示,因為線性回歸的代價函數可能是非凸的,對於分類問題,使用梯度下降很難得到最小值,上面的代價函數是凸函數*            out = np.hstack((out, temp.reshape(-1,1)))    return out梯度下降使用scipy中optimize中的fmin_bfgs函數
  • 機器學習——梯度下降、梯度下降的線性回歸算法
    一、梯度下降梯度下降是一個用來求函數最小值的算法,我們將使用梯度下降算法來求出代價函數J(θo,θ1)的最小值。梯度下降算法中要做的就是不停地一點點改變θo和θ1,直到J成為最小值或局部最小值。通常將θo和θ1的初始值設為0。
  • 邏輯回歸的sklearn實現
    上篇講到邏輯回歸的算法實例,這篇主要講邏輯回歸的sklearn實現。
  • Logistic邏輯回歸原理及實現
    這將會是激動人心的一刻,因為我們將首次接觸到最優算法。仔細想想就會發現其實我們生活中遇到很多最優化問題,比如如何在最短時間內從A到達B。如何投入最少的工作量獲得最大效益,如何使用最短的療程達到最好的治療效果。可見最優化的作用十分強大,接下來我們介紹幾種最優化算法。
  • 直播案例 | 使用感知機、邏輯回歸、支持向量機進行中文新聞主題分類
    本案例首先藉助  Python 實現了感知機、邏輯回歸和線性支持向量機算法。然後在一個隨機生成的二維數據集上展示了三種算法的運行流程和結果。進一步地,我們使用一份中文新聞數據集,利用 Sklearn.linear_model 模塊的 SGDClassifier 類分別構建感知機、邏輯回歸和線性支持向量機模型。最後,使用混淆矩陣對新聞主題分類的效果進行了評估。
  • 收藏 | 如何用Python實現機器學習算法(完整代碼)
    用Python實現出來的機器學習算法都是什麼樣子呢?下面從線性回歸到反向傳播算法、從SVM到K-means聚類算法,咱們一一來分析其中的Python代碼。為什麼不用線性回歸的代價函數表示,因為線性回歸的代價函數可能是非凸的,對於分類問題,使用梯度下降很難得到最小值,上面的代價函數是凸函數
  • 機器學習:隨機梯度下降和批量梯度下降算法介紹
    機器學習:隨機梯度下降和批量梯度下降算法介紹 佚名 發表於 2017-11-28 04:00:28 隨機梯度下降(Stochastic gradient
  • 機器學習基礎:線性回歸和梯度下降的初學者教程
    這就是使用梯度下降的原因。❝梯度下降是一種找到最佳擬合線的工具❞在深入研究梯度下降之前,讓我們先看看另一種計算最佳擬合線的方法。❝梯度下降法是一種通過多次迭代最小化誤差平方和來逼近最小平方回歸線的算法。❞梯度下降算法在機器學習術語中,誤差平方和稱為「成本」。這個成本公式是:
  • 【乾貨】深度學習必備:隨機梯度下降(SGD)優化算法及可視化
    來源:CSDN 授權轉載作者:Sebastian Ruder譯者:一隻鳥的天空【新智元導讀】梯度下降算法是機器學習中使用非常廣泛的優化算法,也是眾多機器學習算法中最常用的優化方法。這篇文章首先介紹梯度下降算法的三種框架,然後介紹它們所存在的問題與挑戰,接著介紹一些如何進行改進來解決這些問題,隨後,介紹如何在並行環境中或者分布式環境中使用梯度下降算法。最後,指出一些有利於梯度下降的策略。
  • 【算法】Python實現機器學習算法
    那麼,用Python實現出來的機器學習算法都是什麼樣子呢?營長剛好在 GitHub 上發現了東南大學研究生「Lawlite」的一個項目——機器學習算法的Python實現,下面從線性回歸到反向傳播算法、從SVM到K-means聚類算法,咱們一一來分析其中的Python代碼。