您好,登錄后才能下訂單哦!
本篇內容主要講解“C++怎么實現softmax函數”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C++怎么實現softmax函數”吧!
今天面試字節算法崗時被問到的問題,讓我用C++實現一個softmax函數。softmax是邏輯回歸在多分類問題上的推廣。大概的公式如下:
即判斷該變量在總體變量中的占比。
我們用vector來封裝輸入和輸出,簡單的按公式復現。
vector<double> softmax(vector<double> input) { double total=0; for(auto x:input) { total+=exp(x); } vector<double> result; for(auto x:input) { result.push_back(exp(x)/total); } return result; }
測試用例1: {1, 2, 3, 4, 5}
測試輸出1: {0.0116562, 0.0316849, 0.0861285, 0.234122, 0.636409}
經過簡單測試是正常的。
但是這時面試官提出了一個問題,即如果有較大輸入變量時會怎么樣?
測試用例2: {1, 2, 3, 4, 5, 1000}
測試輸出2: {0, 0, 0, 0, 0, nan}
由于 e^1000已經溢出了雙精度浮點(double)所能表示的范圍,所以變成了NaN(not a number)。
我們注意觀察softmax的公式:
如果我們給上下同時乘以一個很小的數,最后答案的值是不變的。
那我們可以給每一個輸入 x i 都減去一個值 a ,防止爆精度。
大致表示如下:
vector<double> softmax(vector<double> input) { double total=0; double MAX=input[0]; for(auto x:input) { MAX=max(x,MAX); } for(auto x:input) { total+=exp(x-MAX); } vector<double> result; for(auto x:input) { result.push_back(exp(x-MAX)/total); } return result; }
測試用例1: {1, 2, 3, 4, 5, 1000}
測試輸出1: {0, 0, 0, 0, 0, 1}
測試用例1: {0, 19260817, 19260817}
測試輸出1: {0, 0.5, 0.5}
我們發現結果正常了。
#include <iostream> #include <vector> #include <math.h> using namespace std; vector<double> softmax(vector<double> input) { double total=0; double MAX=input[0]; for(auto x:input) { MAX=max(x,MAX); } for(auto x:input) { total+=exp(x-MAX); } vector<double> result; for(auto x:input) { result.push_back(exp(x-MAX)/total); } return result; } int main(int argc, char *argv[]) { int n; cin>>n; vector<double> input; while(n--) { double x; cin>>x; input.push_back(x); } for(auto y:softmax(input)) { cout<<y<<' '; } }
到此,相信大家對“C++怎么實現softmax函數”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。