機器學習是一種認識世界的方式
首先,要感謝機智又有漂亮女朋友的 @張子浩 ,聽君一席話,勝讀十年書。
今天,無意中想要看一看,每個學校各個專業畢業後的薪資水平,能找到各個學校的平均薪酬,也能找到各個專業的平均薪酬,可找不到每個學校按專業統計的薪酬數據。因此,這個問題就變成了:如圖所示,已知道專業的平均薪酬和學校的平均薪酬,如何估計學校對應專業的平均薪酬?
最簡單的思路就是高中數學,聯立方程求解,可是題目中有20個未知數 ,卻僅有9個方程。約束條件不足,無法求出準確解。
可是就沒辦法了嗎?NO~我們可以用神經網路的視角來思考這個問題。求平均可以看作是,權重 固定為1/N(N為相應的維度)的神經網路。矩陣里的變數初始化,然後以神經網路的輸出與平均值的均方誤差作為損失函數,然後訓練網路,讓誤差反向傳播,則可給出滿足該約束條件且使得損失函數最小的解。
而專業和學校可以分別看作兩個神經網路,而這個問題則可以轉化為共享參數的兩個神經網路的多任務的學習問題。
下面用一個玩具模型來闡述多任務學習。
假設我們一開始,知道正確答案:我們有3個學校,4個專業,分別的薪資用下面這個矩陣表示:
matrix = np.array([[15000, 12000, 10000, 8000], [14000, 11000, 9000, 7000], [13000, 10000, 8000, 6000]])
我們沿不同軸求平均值當作回歸目標:
行平均: [11250, 10250, 9250]
列平均: [14000, 11000 ,9000 ,7000]
矩陣變數初始化,然後分別計算行的損失函數和列的損失函數,然後加在一起共同優化。下面是代碼:
# -*- coding: utf-8 -*-"""Spyder EditorThis is a temporary script file."""import numpy as npimport torchfrom torch.autograd import Variablematrix = np.array([[15000, 12000, 10000, 8000], [14000, 11000, 9000, 7000], [13000, 10000, 8000, 6000]])col_avg = np.mean(matrix, axis=0)row_avg = np.mean(matrix, axis=1)global_avg = np.mean(matrix)#init x with random variablex = np.ones([3,4])*global_avg#make x variblex_var = Variable(torch.FloatTensor(x),requires_grad=True)optimizer = torch.optim.SGD([x_var], lr=0.1)for train_step in range(500): row_loss = 0 for i in range(x_var.size()[0]): #print (x_var[i,:]) x_row_avg = torch.mean(x_var[i,:]) row_loss += (x_row_avg - row_avg[i])**2 row_loss = row_loss/x_var.size()[0] col_loss = 0 for j in range(x_var.size()[1]): #print (x_var[i,:]) x_col_avg = torch.mean(x_var[:,j]) col_loss += (x_col_avg - col_avg[j])**2 col_loss = col_loss/x_var.size()[1] total_loss = col_loss + row_loss if train_step % 10 == 0: print (total_loss.data.numpy()[0]) optimizer.zero_grad() # 清空上一步的殘餘更新參數值 total_loss.backward() # 誤差反向傳播, 計算參數更新值 optimizer.step() print (x_var)
用SGD訓練五百輪後,參數就已經非常接近正確答案了:
Variable containing: 14998.9463 11999.6104 10000.0537 8000.4980 13999.1533 10999.8330 9000.2881 7000.7261 12999.3818 10000.0547 8000.5024 6000.9580[torch.FloatTensor of size 3x4]
一個看似和神經網路完全無關的問題,通過合理的分析和轉化,變成一個神經網路問題,從而得到解決。機器學習實在是太酷炫了!
機器學習不止是調參,更是一種認識世界的方式!
推薦閱讀:
※谷歌大腦發布神經架構搜索新方法:提速1000倍
※機器學習(吳恩達)之學習筆記2--淺層神經網路
※項目筆記(一):實驗——用神經網路實現midi音樂旋律音軌的確定
※《麻省理工科技評論》全球十大突破性技術,阿里巴巴正研究其中4項
※GAN之父:讓機器擁有天賦 我還在對付利用AI作惡的人