找着找着工做就發現算法這東西日常只學了個皮毛,面試官問的深一點就啥都不會了,因此在這裏把看過的學過的所有仔細打磨一遍,刨根問底,由於總有一些東西是日常書上或者博客上沒有仔細寫一筆帶過的,而親愛的面試官就喜歡問這些一筆帶過的,反正就是得先會從頭至尾造個火箭,你才能進來擰螺絲。html
這裏寫的東西基本上是給本身作個總結,由於我記性很差過一陣不用確定就忘,因此不會上來就羅列公式,那樣我本身都看不下去。可是也不會不涉及公式,由於面試官就是要你手推公式啊喂!因此我會盡可能用相互融合的方式把算法的道理講清楚,也把公式弄明白。面試
假設咱們拿到了一家大廠的offer,而後爲了看看真實的工資狀況咱們找神奇的海螺獲取到了公司的不少員工的工資,但是光看也看不出什麼,這時咱們聽到HR說工資和工齡以及績效有關,剛好神奇的海螺又給了咱們這些員工的工齡和績效。這下咱們可就開心了,咱們隱約以爲好像能夠用個什麼科學的方法把咱們將來的工資算出來,而後就升職加薪排隊出如今咱們面前了……等等,這隻有工資,升職又是靠什麼呢?神奇的海螺感受到了咱們的疑問,又給了咱們這些員工的升職狀況。嗯,拿着手裏沉甸甸的數據,看着海螺遠去的背影,咱們知道升職和加薪的祕密就在咱們手中了。算法
咱們先從線性迴歸提及,由於這個邏輯迴歸是線性模型,不管如何也是繞不過線性迴歸的。咱們拿到手的數據顯然應該是這樣數組
工資 | 工齡 | 績效 |
---|---|---|
5k | 2 | 3.5 |
10k | 5 | 3.5 |
15k | 6 | 3.75 |
…… | …… | …… |
咱們把工資視爲,工齡和績效視爲和,若是使用線性方程表示的話有函數
寫的更通常一點學習
這裏的和就都是向量形式了。那麼咱們有了這樣的一個方程(其實就是模型),咱們須要知道的是裏面的參數和該如何求出。等等,都已是向量了,咱們爲何不把寫進參數中呢?咱們人爲的對數據增長一列,即優化
工資 | 工齡 | 績效 | 無實義 |
---|---|---|---|
5k | 2 | 3.5 | 1 |
10k | 5 | 3.5 | 1 |
15k | 6 | 3.75 | 1 |
…… | …… | …… | 1 |
而後把收入中,就有.net
這裏的設計
而後對於就是cdn
那麼模型就能夠表示爲
如今考慮如何求呢?咱們假設咱們已知了一個參數向量,那麼咱們起碼知道如何評價它————也就是看他算的準不許。咱們用咱們真實的工資來和模型的輸出作一個對比,要是差的很少就說明他好,差的多就說明很差。那麼咱們選均方根偏差做爲這個評價函數(也就是損失函數),有
咱們發現選MSE做爲損失函數的話就能夠把預測值與真值之間的差轉換到,那顯然這個結果越接近0就越好。因此不妨咱們把損失函數展開,就有
(ps,這裏不知道會不會有面試官懟人問爲何MSE不用MAE,這應該和MAE不到處可導有關,延申下去可能還有L1和L2範數,以及爲何L1有稀疏做用……可以牽出太多了,標記一下下次解釋)
再展開有
求個導數
令他們等於零獲得
因而咱們知道了參數如何計算,有了參數,也就有了模型,咱們的線性模型就這樣出來啦。
咱們小小總結一下線性迴歸的這一套流程。①咱們先定了模型的樣式(線性的),②而後就知道了咱們須要求出的參數是什麼(),③接下來咱們找了一個評價函數用於評價咱們的模型到底好很差(MSE),④把咱們的模型帶入MSE裏面,經過數學的方式解出了咱們的參數,從而完成了咱們的模型。
是否是感受有點輕鬆哈,這麼容易一個模型就被咱們算出來了,總算知道那些專攻數學的人的快感在哪裏了。都不用作實驗,經過證實就直接宣告告終論的正確
該開始上硬菜了,如今咱們知道咱們的薪資了,那咱們何時升職呢?假設咱們拿到的數據是這樣的
一年內是否升職 | 工齡 | 績效 |
---|---|---|
是 | 2 | 3.5 |
否 | 5 | 3.5 |
是 | 6 | 3.75 |
…… | …… | …… |
那咱們怎麼去算咱們一年以內升職的機率呢?不如照葫蘆畫瓢先來一套線性迴歸,那麼咱們先上一個線性方程吧。等等,不太對,咱們若是要用線性方程去擬合咱們一年以內是否升職的機率,那麼咱們的數據的第一列應該是一年內升職的機率,而不是一個肯定的結果。那咋辦呢?而咱們的模型要輸出機率,咱們獲得的最終結果倒是結果,那又要怎麼將這兩個結合從而評價咱們的模型呢?咱們這裏用一個sigmoid函數來幫助咱們。
這個函數你們確定都熟悉了,圖像就不展現了,它有兩個性質是重要且會用到的這裏提一下
這個函數的好處是能夠把實數域的值映射到,那麼這個輸出就能夠看做是一個機率,而輸入是什麼呢,就是咱們最原始的線性模型的輸出。光說可能很差理解,咱們整個公式吧,假設咱們有個線性模型
寫成向量形式
誒有點熟悉啊,這不就是前面剛提過的線性迴歸嘛。行了別講了,這題我會,接下來要找損失函數,MSE,而後帶入,求解,齊活
然而並非這樣的,假設咱們是一維的數據,好比說咱們不知道每一個人的績效,只知道工齡,而後把他們的升職與否畫在圖上,有
這樣的數據如何優美的用一條直線擬合呢?很明顯不合適的這裏也是我曾經疑惑的一個點,爲何非要用sigmoid,直接的線性迴歸爲何不能作,其實有時候本身動手作一步,答案就擺在眼前了。後期我會把這裏的圖片更詳細的畫一下,這裏先這樣
那麼咱們仍是乖乖的求助sigmoid吧,咱們把上面的輸出整合到sigmoid中,有
這裏面是邏輯迴歸裏面的線性部分,而後將這個線性部分經過一個sigmoid函數以後,咱們就獲得了最後的機率,表明預測類別爲1類的機率。那接下來要作第二步,找出咱們要求的模型參數————仍是,多好。那麼第三步,咱們該評價咱們的模型了,得找出一個損失函數才行,那麼這個函數用什麼呢?用咱們的老朋友MSE?這裏咱們先順序往下推,而後再回頭看咱們的討論MSE在這裏是否合適
因爲咱們預測的是類別,好比1類和0類,那咱們就能夠定義一個樣本屬於1類或0類的機率,這是分類問題下才可以有的假設,在迴歸問題下,不存在迴歸結果爲某一值的機率,這一點想來各位看到這裏的都清楚哈。咱們假設類別爲1的機率是,則
這個等式表明當咱們獲得一個數據特徵向量的時候,其屬於正類(1)的機率是,屬於負類(0)的機率是。經過相乘咱們能夠將這個機率整合到一個等式中,即
能夠發現當取1和0的時候正好就是分開的兩個等式。這個時候,在別的Blog裏面就會說須要使這個取最大值,那麼爲何呢?
想象目前咱們拿到一個數據特徵向量,咱們這個時候偷偷看了一眼答案,發現這個其實是正樣本,也就是標籤爲1,那麼咱們這個時候是否是就要祈禱咱們的模型預測其爲1的機率越靠近1越好,若是等於1就最好了!而這個時候的機率是,也就是越大越好。OK,那麼反過來,假設咱們偷看了答案,發現其實是負樣本,標籤爲0,那麼咱們須要咱們的模型預測它爲0的機率越大越好,此時機率是,因此越小越好。
這個時候有點暈,一會須要越大越好,一會須要越小越好,那咱們如何衡量呢?實際上這就是把兩個式子合二爲一的優勢。當咱們的樣本標籤爲1的時候,咱們的會變成,此時咱們但願越大越好,於是越大越好;
當咱們的樣本標籤爲0,咱們的會變成,此時咱們但願越大越好,一樣越大越好,那麼咱們就發現了不管什麼狀況下,越大越好。
這裏這麼多廢話就是想說清楚一句:令每一個樣本屬於其真實標籤的機率越大越好
這樣咱們就有了目標,而後就能先把損失函數寫出來,對機率取對數而且取反,有
在這裏咱們進行了取對數的操做,這樣不改變原函數的單調性,另外對原函數進行了取反(加負號)的操做,這樣咱們的目標就從讓原函數最大變爲了新函數的最小,畢竟「最小」更符合「損失」,因此咱們的損失函數就如上式所示,由兩部分的對數組成,這個式子同時也稱做交叉熵函數。還有要注意的一點是,損失函數的寫法中沒有顯式寫出的參數,這其實是由於是存在於機率中的,這裏的機率實際上就是sigmoid函數的預測機率輸出。
這裏的損失函數形式是針對單個樣本的,對總體樣本前面加上求和符號便可
此時有了損失函數,咱們就能夠求使得損失函數最小的那個參數。那麼在此咱們先暫停一下,其實損失函數還有另一種推導方式。
剛纔咱們是從機率的角度,從二分類問題的機率分佈(實際上就是伯努利分佈)不斷的推導,而後找到了優化目標,也就定義了損失函數。如今咱們從另外的角度,最大似然的角度來推導一遍損失函數。
這裏的這個推導結果可能並非常見的邏輯迴歸的損失函數的形式,但我以爲理解了多少有幫助,萬一面試官就問了呢
此次咱們從數據的角度分析,假設已有的數據是:
這裏每一個括號的第一項表明了特徵數據向量,第二項表明了對應的標籤,注意這裏的正樣本仍然是1,可是負樣本咱們此處定義爲了-1
負樣本的標籤再也不是0,這一點很重要
這些數據的產生是相互獨立的,因此得到這筆數據的機率就是
改寫爲條件機率的形式
這裏面的能夠理解爲是模型在輸入特徵數據以後獲得其屬於的機率,而可能沒法找到一個實際的物理含義的釋義,由於咱們這裏是經過數學的方法直接拆分的,可是咱們繼續推下去能夠發現這個其實並不影響咱們的推導。咱們這裏假設每筆數據的機率分佈爲
改寫咱們上面的條件機率
此時咱們就能夠理解爲咱們獲得的數據的機率是上面這個表達式,那麼應用最大似然的思想,我既然獲得了這筆數據,就必定程度上說明這筆數據可能就是這樣的;真實的「特徵數據」與其對應的「標籤」之間的關係就是這樣的;在真實的數據中,我獲得這樣的一個數據的機率就是最大的。那麼咱們如今就是要求這樣的一個,去使得上面這個機率結果最大。而在這個機率中,是與標籤無關的,也就意味着咱們使得這個機率結果最大主要要求的仍是,因爲連乘的關係,咱們只需將的乘積最大即達到了總體的最大,也就是說使得
最大。這時咱們能夠帶入咱們的模型,也就是
獲得
結合sigmoid函數性質,有
則優化目標爲
這裏把放進sigmoid函數中,正好能夠表達出全部的狀況,要注意這裏的的正負類的標誌是和。對上式取對數,得
這樣咱們就化連乘爲相加,經過展開的表達式便可獲得咱們的損失函數,即
這樣咱們就推導出來了邏輯迴歸的另外一個損失函數的表達形式,能夠看出兩個表達式並不同,那麼它們都是邏輯迴歸的損失函數嗎?他們其實是一個等式仍是說他們確實是兩種損失函數?
這裏其實我也不知道,感受論文原文中應該有描述,可是還沒來的看論文,先按照本身的推導猜一猜吧,若是有大神看到了知道他們之間關係的不妨給我也點撥一下…
把兩種形式的損失函數通通羅列於此,分別都取一個樣本的狀況下,有
將展開,則有, 對求導,有
這裏能看出二者的求導結果好像並不一致,這其實和兩種狀況下的標籤的取值不一樣有關,第一種的標籤取值爲,而第二種的標籤取值爲,咱們發現,當標籤爲正,即在兩種狀況下都取時,二者的求導結果是同樣的,那麼咱們關注一下標籤爲負的時候,此時,對的導數有
對於,其標籤取,有
以上的設計公式推導的部分會常常的使用到sigmoid函數的兩個性質,這兩個性質在上文中已經說起
至此咱們發現兩種形式的損失函數的導數(梯度)是一致的,因此我認爲這兩種形式的損失函數是同一實質的兩種形式,這個結論的得出並不嚴謹,由於導數相同並不表明原函數相同,可是我也沒看論文,因此就這麼猜想了,另外,常見的梯度降低法計算時不就是要梯度麼,他們梯度同樣應該就是一個東西XD
在繼續以前,先小總結一下邏輯迴歸的損失函數,以一個樣本爲例,咱們依次獲得了
由於兩種形式的損失函數是同樣的,這裏就以第一種爲例
至此咱們就從頭至尾推導了一遍邏輯迴歸,哦不,還沒到尾,咱們到這裏只是推導到了損失函數,而知道了損失函數咱們還須要求解,找到可以使損失函數達到最小的取值,這樣纔算完成了所有的邏輯迴歸。
咱們想到求最小值,默認的想法都是求一階導數,而後令其等於零從而求解,那麼這個方法在這裏是否適用呢?咱們發現參數是包含在sigmoid函數中的的指數項的,這致使在多維特徵的狀況下,涉及複雜的矩陣運算,這顯然是不方便求解的。所以咱們選擇另一種思路,經過隨機一個函數上的初始點,而後不斷迭代,令其每次迭代時都儘量使損失函數的結果變小,這樣在屢次的迭代以後,咱們就能夠獲得令損失函數最小的那一組參數。
這裏的關於優化的描述並不嚴謹,只是表達一個優化迭代的意思
常見的優化算法有不少,梯度降低法,牛頓法等,而且近年來在這些傳統優化算法上有着不少的優化改進,這裏不詳細介紹優化算法(由於工程量太大了),僅簡單說起一下梯度降低法的基本思路。
梯度降低法首先對參數隨機選取一個初始點,而後計算損失函數在該點的梯度(也就是導數),而後沿着梯度方向前進一個增量,從而獲得新的,不斷循環這個過程,直到梯度爲零(到達極值),或者梯度達到了閾值爲止。用公式表示即
這裏的表明學習率,也就是當咱們求出了梯度方向後,以爲咱們沿着這個方向走多遠的一個參數,這個參數不屬於模型自己,須要人工設定。經過這樣的思路,咱們就能最終求得邏輯迴歸中的參數的最優解,從而完成整個模型。
一樣的,咱們小小總結一下邏輯迴歸的這一套流程。①咱們先定了模型的樣式(線性的內核套一個sigmoid的外殼),②而後就知道了咱們須要求出的參數是什麼(),③接下來咱們分別用兩種思路找到了可以評估模型的損失函數(交叉熵),④結合相關的優化算法,找到最優的參數,從而完成了整個模型。
在咱們完成了模型以後,咱們想起來還有一個MSE被咱們遺忘了,那麼咱們爲何在損失函數階段不直接選擇MSE呢?首先咱們從結尾處看,若是咱們選擇MSE做爲損失函數,那麼對單個樣本有
則梯度爲
而交叉熵的梯度爲
對比之下發現MSE的梯度相對於交叉熵的梯度多乘了一個係數,而這個係數就是sigmoid函數的導數,咱們不妨畫出sigmoid的導數圖像,有
能夠看到sigmoid的導數的最大值只有0.25,而在輸入值較大或較小時都趨近於0。可是咱們的優化目標就是在樣本爲正時輸出趨近於+1,那麼就要輸入足夠大,所以若是使用MSE做爲損失函數的話,當接近優化目標時極可能出現梯度消失,沒法繼續逼近損失函數最小值。
此外,使用MSE做爲損失函數會致使引入模型sigmoid後非凸,此時會有不少局部最優,影響優化算法尋找全局最優勢。
至此算是把邏輯迴歸從頭至尾過了一遍,用關鍵要點簡單總結一下吧。
線性迴歸
邏輯迴歸
嗯,寫到這裏發現這個邏輯迴歸其實還挺有邏輯的XD
各位看官有什麼問題或者發現我哪裏寫錯了都歡迎討論指出啊,畢竟我也是個菜雞,不免有錯的地方,能夠多多討論加深理解
參考博客
www.jianshu.com/p/b07f4cd32…
blog.csdn.net/weixin_4153…
www.cnblogs.com/shayue/p/10… 這個寫的真的很好
www.cnblogs.com/shayue/p/10…
blog.csdn.net/weiweixiao3…
www.cnblogs.com/maybe2030/p…
blog.csdn.net/mzpmzk/arti…
blog.csdn.net/dpengwang/a…
blog.csdn.net/huwenxing08…
yq.aliyun.com/articles/66…
blog.csdn.net/alw_123/art…