❶ 200分求動態規劃詳解!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
嗯···我學動歸不是很久,同樣是迷惘過,估計兩個月前剛剛開竅……
你看他寫的什麼無後效性什麼最優子結構的就頭大,我也頭大%…………
動態規劃一般解決兩類問題,一類是最優化問題,就是問你最大價值最小數什麼的,另一類是方案總數問題。
細分的話類型很多,
我見得多的(我是高二學生,目前在籌備NOIP)
(你那題多我就只說名字了)
背包,樓上連9講都放上來了我就不多說了……
最長不上升不下降子序列問題(比如說潘帕斯雄鷹生日模擬賽的飛翔,就是很經典的不下降的變形)
資源分配問題(比如說櫥窗布置,馬棚問題,機器分配問題)
區間動歸(乘積最大,能量項鏈等等)
最長公共子序列問題(有個遺傳編碼好像);
解決方案樹的比如說爬樓梯問題……………………
動態規劃的類型很多很多,因為他很靈活的,我們老師曾經給我們找了100個DP方程,但是那都沒有用,強記根本記不住,關鍵是理解。
深入一點的就有DP的優化,時間空間的降維(就是用別的方法去做,或者比如說背包本來是二維的空間優化過該成一維的了),樹形DP(這個我也不會)。
(優化裡面有個很經典的題《過河》)
我對DP是屬於那種突然就開了竅的……別看說「動態規劃」什麼的唬人,其實就是一個比較一個計算,知道他干什麼了題上來就有頭緒,方程啊思想啊就有了……
主要也是多看題吧,從簡單的開始,理解他的思想……自己寫動歸的時候注意下面幾個問題:
1、大前提是確定你做的是動歸題……看得多了也就知道自己面對的是什麼類型的題了
2、次前提是想法要對(我做題的時候先想這道題時間空間的維度,然後根據這個去想方程),方程正確,
實在想不起來可以先看題解,去理解人家的思想之後,不要看標程把程序做出來……
3、注意數組不要開的過小,一般都是左右都開大一點,比如他的數據范圍是1~100 ,數組就開0~101.這個是防越界的,因為很多DP賦初值的時候會用到F[0],F[0,0]
4、初始值要正確,因為很多DP其他地方都是正確的因為初始值賦錯了而全部過不了的情況是很常見的……(比如說USACO裡面的貨幣系統)
5、DP循環的范圍要正確,一般根據題來判斷范圍寫多少的(比如說櫥窗問題,今天下午寫這個題因為循環寫錯了一直AC不了)
USACO里也有很多DP題,可以做……
以上全部手打,希望能對你有所幫助。
我也是正在學習的人,上面的東西不一定全部正確,但是對我而言很受用,也算是我的經驗了。希望日後能一起學習交流外加進步嘍
QQ:340131980
1. 資源問題1
-----機器分配問題
F[I,j]:=max(f[i-1,k]+w[i,j-k])
2. 資源問題2
------01背包問題
F[I,j]:=max(f[i-1,j-v]+w,f[i-1,j]);
3. 線性動態規劃1
-----樸素最長非降子序列
F:=max{f[j]+1}
4. 剖分問題1
-----石子合並
F[i,j]:=min(f[i,k]+f[k+1,j]+sum[i,j]);
5. 剖分問題2
-----多邊形剖分
F[I,j]:=min(f[i,k]+f[k,j]+a[k]*a[j]*a);
6. 剖分問題3
------乘積最大
f[i,j]:=max(f[k,j-1]*mult[k,i]);
7. 資源問題3
-----系統可靠性(完全背包)
F[i,j]:=max{f[i-1,j-c*k]*P[I,x]}
8. 貪心的動態規劃1
-----快餐問題
F[i,j,k]:=max{f[i-1,j',k']+(T-(j-j')*p1-(k-k')*p2) div p3}
9. 貪心的動態規劃2
-----過河 f=min{{f(i-k)} (not stone)
{f(i-k)}+1} (stone); +貪心壓縮狀態
10. 剖分問題4
-----多邊形-討論的動態規劃
F[i,j]:=max{正正 f[I,k]*f[k+1,j];
負負 g[I,k]*f[k+1,j];
正負 g[I,k]*f[k+1,j];
負正 f[I,k]*g[k+1,j];} g為min
11. 樹型動態規劃1
-----加分二叉樹 (從兩側到根結點模型)
F[I,j]:=max{f[I,k-1]*f[k+1,j]+c[k]}
12. 樹型動態規劃2
-----選課 (多叉樹轉二叉樹,自頂向下模型)
F[I,j]表示以i為根節點選j門功課得到的最大學分
f[i,j]:=max{f[t.l,k]+f[t.r,j-k-1]+c}
13. 計數問題1
-----砝碼稱重
f[f[0]+1]=f[j]+k*w[j];
(1<=i<=n; 1<=j<=f[0]; 1<=k<=a;)
14. 遞推天地1
------核電站問題
f[-1]:=1; f[0]:=1;
f:=2*f[i-1]-f[i-1-m]
15. 遞推天地2
------數的劃分
f[i,j]:=f[i-j,j]+f[i-1,j-1];
16. 最大子矩陣1
-----一最大01子矩陣
f[i,j]:=min(f[i-1,j],v[i,j-1],v[i-1,j-1])+1;
ans:=maxvalue(f);
17. 判定性問題1
-----能否被4整除
g[1,0]:=true; g[1,1]:=false; g[1,2]:=false; g[1,3]:=false;
g[i,j]:=g[i-1,k] and ((k+a[i,p]) mod 4 = j)
18. 判定性問題2
-----能否被k整除
f[I,j±n mod k]:=f[i-1,j]; -k<=j<=k; 1<=i<=n
20. 線型動態規劃2
-----方塊消除游戲
f[i,i-1,0]:=0
f[i,j,k]:=max{f[i,j-1,0]+sqr(len(j)+k),
f[i,p,k+len[j]]+f[p+1,j-1,0]}
ans:=f[1,m,0]
21. 線型動態規劃3
-----最長公共子串,LCS問題
f[i,j]={0(i=0)&(j=0);
f[i-1,j-1]+1 (i>0,j>0,x=y[j]);
max{f[i,j-1]+f[i-1,j]}} (i>0,j>0,x<>y[j]);
22. 最大子矩陣2
-----最大帶權01子矩陣O(n^2*m)
枚舉行的起始,壓縮進數列,求最大欄位和,遇0則清零
23. 資源問題4
-----裝箱問題(判定性01背包)
f[j]:=(f[j] or f[j-v]);
24. 數字三角形1
-----樸素の數字三角形
f[i,j]:=max(f[i+1,j]+a[I,j],f[i+1,j+1]+a[i,j]);
25. 數字三角形2
-----晴天小豬歷險記之Hill
同一階段上暴力動態規劃
if[i,j]:=min(f[i,j-1],f[I,j+1],f[i-1,j],f[i-1,j-1])+a[i,j]
26. 雙向動態規劃1
數字三角形3
-----小胖辦證
f[i,j]:=max(f[i-1,j]+a[i,j],f[i,j-1]+a[i,j],f[i,j+1]+a[i,j])
27. 數字三角形4
-----過河卒
//邊界初始化
f[i,j]:=f[i-1,j]+f[i,j-1];
28. 數字三角形5
-----樸素的打磚塊
f[i,j,k]:=max(f[i-1,j-k,p]+sum[i,k],f[i,j,k]);
29. 數字三角形6
-----優化的打磚塊
f[I,j,k]:=max{g[i-1,j-k,k-1]+sum[I,k]}
30. 線性動態規劃3
-----打鼴鼠』
f:=f[j]+1;(abs(x-x[j])+abs(y-y[j])<=t-t[j])
31. 樹形動態規劃3
-----貪吃的九頭龍
32. 狀態壓縮動態規劃1
-----炮兵陣地
Max(f[Q*(r+1)+k],g[j]+num[k])
If (map and plan[k]=0) and
((plan[P] or plan[q]) and plan[k]=0)
33. 遞推天地3
-----情書抄寫員
f:=f[i-1]+k*f[i-2]
34. 遞推天地4
-----錯位排列
f:=(i-1)(f[i-2]+f[i-1]);
f[n]:=n*f[n-1]+(-1)^(n-2);
35. 遞推天地5
-----直線分平面最大區域數
f[n]:=f[n-1]+n
:=n*(n+1) div 2 + 1;
36. 遞推天地6
-----折線分平面最大區域數
f[n]:=(n-1)(2*n-1)+2*n;
37. 遞推天地7
-----封閉曲線分平面最大區域數
f[n]:=f[n-1]+2*(n-1)
:=sqr(n)-n+2;
38 遞推天地8
-----凸多邊形分三角形方法數
f[n]:=C(2*n-2,n-1) div n;
對於k邊形
f[k]:=C(2*k-4,k-2) div (k-1); //(k>=3)
39 遞推天地9
-----Catalan數列一般形式
1,1,2,5,14,42,132
f[n]:=C(2k,k) div (k+1);
40 遞推天地10
-----彩燈布置
排列組合中的環形染色問題
f[n]:=f[n-1]*(m-2)+f[n-2]*(m-1); (f[1]:=m; f[2]:=m(m-1);
41 線性動態規劃4
-----找數
線性掃描
sum:=f+g[j];
(if sum=Aim then getout; if sum<Aim then inc(i) else inc(j);)
42 線性動態規劃5
-----隱形的翅膀
min:=min{abs(w/w[j]-gold)};
if w/w[j]<gold then inc(i) else inc(j);
43 剖分問題5
-----最大獎勵
f:=max(f,f[j]+(sum[j]-sum)*i-t
44 最短路1
-----Floyd
f[i,j]:=max(f[i,j],f[i,k]+f[k,j]);
ans[q[i,j,k]]:=ans[q[i,j,k]]+s[i,q[i,j,k]]*s[q[i,j,k],j]/s[i,j];
45 剖分問題6
-----小H的小屋
F[l,m,n]:=f[l-x,m-1,n-k]+S(x,k);
46 計數問題2
-----隕石的秘密(排列組合中的計數問題)
Ans[l1,l2,l3,D]:=f[l1+1,l2,l3,D+1]-f[l1+1,l2,l3,D];
F[l1,l2,l3,D]:=Sigma(f[o,p,q,d-1]*f[l1-o,l2-p,l3-q,d]);
47 線性動態規劃
------合唱隊形
兩次F:=max{f[j]+1}+枚舉中央結點
48 資源問題
------明明的預算方案:加花的動態規劃
f[i,j]:=max(f[i,j],f[l,j-v-v[fb]-v[fa]]+v*p+v[fb]*p[fb]+v[fa]*p[fa]);
49 資源問題
-----化工場裝箱員
50 樹形動態規劃
-----聚會的快樂
f[i,2]:=max(f[i,0],f[i,1]);
f[i,1]:=sigma(f[t^.son,0]);
f[i,0]:=sigma(f[t^.son,3]);
51 樹形動態規劃
-----皇宮看守
f[i,2]:=max(f[i,0],f[i,1]);
f[i,1]:=sigma(f[t^.son,0]);
f[i,0]:=sigma(f[t^.son,3]);
52 遞推天地
-----盒子與球
f[i,1]:=1;
f[i,j]:=j*(f[i-1,j-1]+f[i-1,j]);
53 雙重動態規劃
-----有限的基因序列
f:=min{f[j]+1}
g[c,i,j]:=(g[a,i,j] and g[b,i,j]) or (g[c,i,j])
54 最大子矩陣問題
-----居住空間
f[i,j,k]:=min(min(min(f[i-1,j,k],f[i,j-1,k]),
min(f[i,j,k-1],f[i-1,j-1,k])),
min(min(f[i-1,j,k-1],f[i,j-1,k-1]),
f[i-1,j-1,k-1]))+1;
55 線性動態規劃
------日程安排
f:=max{f[j]}+P[I]; (e[j]<s)
56 遞推天地
------組合數
C[I,j]:=C[i-1,j]+C[I-1,j-1]
C[I,0]:=1
57 樹形動態規劃
-----有向樹k中值問題
F[I,r,k]:=max{max{f[l,I,j]+f[r,I,k-j-1]},f[f[l,r,j]+f[r,r,k-j]+w[I,r]]}
58 樹形動態規劃
-----CTSC 2001選課
F[I,j]:=w(if i∈P)+f[l,k]+f[r,m-k](0≤k≤m)(if l<>0)
59 線性動態規劃
-----多重歷史
f[i,j]:=sigma{f[i-k,j-1]}(if checked)
60 背包問題(+-1背包問題+回溯)
-----CEOI1998 Substract
f[i,j]:=f[i-1,j-a] or f[i-1,j+a]
61 線性動態規劃(字元串)
-----NOI 2000 古城之謎
f[i,1,1]:=min{f[i+length(s),2,1], f[i+length(s),1,1]+1}f[i,1,2]:=min{f[i+length(s),1,2]+words[s],f[i+length(s),1,2]+words[s]}
62 線性動態規劃
-----最少單詞個數
f[i,j]:=max{f[I,j],f[u-1,j-1]+l}
63 線型動態規劃
-----APIO2007 數據備份
狀態壓縮+剪掉每個階段j前j*2個狀態和j*2+200後的狀態貪心動態規劃
f:=min(g[i-2]+s,f[i-1]);
64 樹形動態規劃
-----APIO2007 風鈴
f:=f[l]+f[r]+{1 (if c[l]<c[r])}
g:=1(d[l]<>d[r]) 0(d[l]=d[r])
g[l]=g[r]=1 then Halt;
65 地圖動態規劃
-----NOI 2005 adv19910
F[t,i,j]:=max{f[t-1,i-dx[d[[t]],j-dy[d[k]]]+1],f[t-1,i,j];
66 地圖動態規劃
-----優化的NOI 2005 adv19910
F[k,i,j]:=max{f[k-1,i,p]+1} j-b[k]<=p<=j;
67 目標動態規劃
-----CEOI98 subtra
F[I,j]:=f[I-1,j+a] or f[i-1,j-a]
68 目標動態規劃
----- Vijos 1037搭建雙塔問題
F[value,delta]:=g[value+a,delta+a] or g[value,delta-a]
69 樹形動態規劃
-----有線電視網
f[i,p]:=max(f[i,p],f[i,p-q]+f[j,q]-map[i,j])
leaves>=p>=l, 1<=q<=p;
70 地圖動態規劃
-----vijos某題
F[I,j]:=min(f[i-1,j-1],f[I,j-1],f[i-1,j]);
71 最大子矩陣問題
-----最大欄位和問題
f:=max(f[i-1]+b,b); f[1]:=b[1]
72 最大子矩陣問題
-----最大子立方體問題
枚舉一組邊i的起始,壓縮進矩陣 B[I,j]+=a[x,I,j]
枚舉另外一組邊的其實,做最大子矩陣
73 括弧序列
-----線型動態規劃
f[I,j]:=min(f[I,j],f[i+1,j-1](ss[j]=」()」or(」[]」)),
f[I+1,j+1]+1 (s[j]=」(」or」[」 ] , f[I,j-1]+1(s[j]=」)」or」]」 )
74 棋盤切割
-----線型動態規劃
f[k,x1,y1,x2,y2]=min{min{f[k-1,x1,y1,a,y2]+s[a+1,y1,x2,y2],
f[k-1,a+1,y1,x2,y2]+s[x1,y1,a,y2]
min{}}
75 概率動態規劃
-----聰聰和可可(NOI2005)
x:=p[p[i,j],j]
f[I,j]:=(f[x,b[j,k]]+f[x,j])/(l[j]+1)+1
f[I,i]=0
f[x,j]=1
76 概率動態規劃
-----血緣關系
F[A, B]=(f[A0, B]+P[A1, B])/2
f[I,i]=1
f[I,j]=0(I,j無相同基因)
77 線性動態規劃
-----決斗
F[I,j]=(f[I,j] and f[k,j]) and (e[I,k] or e[j,k]),i<k<j
78 線性動態規劃
-----舞蹈家
F[x,y,k]=min(f[a[k],y,k+1]+w[x,a[k]],f[x,a[k],k+1]+w[y,a[k]])
79 線性動態規劃
-----積木游戲
F[I,a,b,k]=max(f[I,a+1,b,k],f[i+1,a+1,a+1,k』],f[I,a+1,a+1,k』])
80 樹形動態規劃(雙次記錄)
-----NOI2003 逃學的小孩
樸素的話枚舉節點i和離其最遠的兩個節點 j,k O(n^2)
每個節點記錄最大的兩個值,並記錄這最大值分別是從哪個相鄰節點傳過來的。當遍歷到某個孩子節點的時候,只需檢查最大值是否是從該孩子節點傳遞來的。如果是,就取次大,否則取最大值
81 樹形動態規劃(完全二叉樹)
-----NOI2006 網路收費
F[I,j,k]表示在點i所管轄的所有用戶中,有j個用戶為A,在I的每個祖先u上,如果N[a]>N則標0否則標1,用二進制狀態壓縮進k中,在這種情況下的最小花費
F[I,j,k]:=min{f[l,u,k and (s<<(i-1))]+w1,f[r,j-u,k and(s<<(i-1))]}
82 樹形動態規劃
-----IOI2005 河流
F:=max
83 記憶化搜索
-----Vijos某題,忘了
F[pre,h,m]:=sigma{SDP(I,h+1,M+i)} (pre<=i<=M+1)
84 狀態壓縮動態規劃
-----APIO 2007 動物園
f[I,k]:=f[i-1,k and not (1<<4)] + NewAddVal
85 樹形動態規劃
-----訪問術館
f[i,j-c×2]:= max ( f[l,k], f[r,j-c×2-k] )
86 字元串動態規劃
-----Ural 1002 Phone
if exist((s,j,i-j)) then f:=min(f,f[j]+1);
87 多進程動態規劃
-----CEOI 2005 service
Min( f[i,j,k], f[i-1,j,k] + c[t[i-1],t] )
Min( f[i,t[i-1],k], f[i-1,j,k] + c[j,t] )
Min( f[i,j,t[i-1]], f[i-1,j,k] + c[k,t] )
88 多進程動態規劃
-----Vijos1143 三取方格數
max(f[i,j,k,l],f[i-1,j-R[m,1],k-R[m,2],l-R[m,3]]);
if (j=k) and (k=l) then inc(f[i,j,k,l],a[j,i-j]) else
if (j=k) then inc(f[i,j,k,l],a[j,i-j]+a[l,i-l]) else
if (k=l) then inc(f[i,j,k,l],a[j,i-j]+a[k,i-k]) else
if (j=l) then inc(f[i,j,k,l],a[j,i-j]+a[k,i-k]) else
inc(f[i,j,k,l],a[j,i-j]+a[k,i-k]+a[l,i-l]);
89 線型動態規劃
-----IOI 2000 郵局問題
f[i,j]:=min(f[I,j],f[k,j-1]+d[k+1,i]);
90 線型動態規劃
-----Vijos 1198 最佳課題選擇
if j-k>=0 then Min(f[i,j],f[i-1,j-k]+time(i,k));
91 背包問題
----- USACO Raucous Rockers
多個背包,不可以重復放物品,但放物品的順序有限制。
F[I,j,k]表示決策到第i個物品、第j個背包,此背包花費了k的空間。
f[I,j,k]:=max(f[I-1,j,k],f[I-1,j,k-t]+p,f[i-1,j-1,maxtime-t])
92 多進程動態規劃
-----巡遊加拿大(IOI95、USACO)
d[i,j]=max{d[k,j]+1(a[k,i] & j<k<i),d[j,k]+1(a[I,j] & (k<j))}。
f[i,j]表示從起點出發,一個人到達i,另一個人到達j時經過的城市數。d[i,j]=d[j,i],所以我們限制i>j
分析狀態(i,j),它可能是(k,j)(j<k<i)中k到達i得到(方式1),也可能是(j,k)(k<j)中k超過j到達i得到(方式2)。但它不能是(i,k)(k<j)中k到達j得到,因為這樣可能會出現重復路徑。即使不會出現重復路徑,那麼它由(j,k)通過方式2同樣可以得到,所以不會遺漏解 時間復雜度O(n3)
93 動態規劃
-----ZOJ cheese
f[i,j]:=f[i-kk*zl[u,1],j-kk*zl[u,2]]+a[i-kk*zl[u,1],j-kk*zl[u,2]]
94 動態規劃
-----NOI 2004 berry 線性
F[I,1]:=s
F[I,j]:=max{min{s-s[l-1]},f[l-1,j-1]} (2≤j≤k, j≤l≤i)
95 動態規劃
-----NOI 2004 berry 完全無向圖
F[I,j]:=f[i-1,j] or (j≥w) and (f[i-1,j-w])
96 動態規劃
-----石子合並 四邊形不等式優化
m[i,j]=max{m[i+1,j], m[i,j-1]}+t[i,j]
97 動態規劃
-----CEOI 2005 service
(k≥long,i≥1)g[i, j, k]=max{g[i-1,j,k-long]+1,g[i-1,j,k]}
(k<long,i≥1) g[i, j, k]=max{g[i-1,j-1,t-long]+1,g[i-1,j,k]}
(0≤j≤m, 0≤k<t) g[0,j,k]=0;
ans:=g[n,m,0]。
狀態優化:g[i, j]=min{g[i-1,j],g[i-1,j-1]+long}
其中(a, b)+long=(a』, b』)的計算方法為:
當b+long ≤t時: a』=a; b』=b+long;
當b+long >t時: a』=a+1; b』=long;
規劃的邊界條件:
當0≤i≤n時,g[i,0]=(0,0)
98 動態規劃
-----AHOI 2006寶庫通道
f[k]:=max{f[k-1]+x[k,j]-x[k,i-1], x[k,j]-x[k,i-1]}
99 動態規劃
-----Travel
A) 費用最少的旅行計劃。
設f表示從起點到第i個旅店住宿一天的最小費用;g表示從起點到第i個旅店住宿一天,在滿足最小費用的前提下所需要的最少天數。那麼:
f=f[x]+v, g=g[x]+1
x滿足:
1、 x<i,且d – d[x] <= 800(一天的最大行程)。
2、 對於所有的t < i, d – d[t] <= 800,都必須滿足:
A. g[x] < g[t](f[x] = f[t]時) B. f[x] < f[t] (其他情況)
f[0] = 0,g[0] = 0。 Ans:=f[n + 1],g[n+1]。
B). 天數最少的旅行計劃。
方法其實和第一問十分類似。
設g』表示從起點到第i個旅店住宿一天的最少天數;f』表示從起點到第i個旅店住宿一天,在滿足最小天數前提下所需要的最少費用。那麼:
g』 = g』[x] + 1, f』 = f』[x] + v
x滿足:
1、 x<i,且d – d[x] <= 800(一天的最大行程)。
2、 對於所有的t < i, d – d[t] <= 800,都必須滿足:
f』[x] < f』[t] g』[x] = g』[t]時
g』[x] < g』[t] 其他情況
f』[0] = 0,g』[0] = 0。 Ans:=f』[n + 1],g』[n+1]。
100 動態規劃
-----NOI 2007 cash
y:=f[j]/(a[j]*c[j]+b[j]);
g:=c[j]*y*a+y*b;
f:=max(f,g)
❷ 論圖形組織器 圖形組織器的分類包括
[摘 要] 圖形組織器是一種可由學習者自由控制、功能強大的可視化學習工具。本文從學習工具的應用角度討論了圖形組織器的內涵、功能、理論基礎、類型、選用和創建原則等基本問題,以期對圖形組織器有一個基本認識。
[關鍵詞] 圖形組織器;功能;類型;選用框架;創建原則
[中圖分類號] G43 [文獻標識碼] A [文章編號] 1672―0008(2009)06-0061-06
一、圖形組織器的內涵
簡單說來,圖形組織器(Graphic Organizers)是一種用於表現學習過程和結果的圖形結構形式。作為一種學習工具,圖形是形式,是載體,對學習的組織是目的,是關鍵。目前,國外對圖形組織器的理解主要有兩種視角。
1.外形特點的視角
圖形組織器是指知識圖、概念圖、故事圖、認知組織器、先行組織者或概念圖示等[1]。如圖形組織器是一種圖解書面或口頭陳述的圖形方式,是表徵信息的可視化方式[2],等等。
2.應用功能的視角
圖形組織器具有廣泛的應用領域和強大的功能。國外許多研究結合圖形組織器的外形和內涵從多方面闡述了圖形組織器的功能作用:(1)圖形組織器是知識、概念或觀點的可視化表徵。它有助於學習者提高學習興趣、激發動機、減低或釋放厭倦感、提高回憶率、闡明信息、組織思維和促進理解[3] 。(2)圖形組織器是用可視化方式表徵信息的圖形結構,可用於各種學習活動中,如頭腦風暴、觀點生成、分析信息、組織信息和表達發現等等[4]。(3)圖形組織器是建構知識和組織信息的視圖化方式。它有助於學習者將許多雜亂或彌散的信息轉換或精煉為一種結構化的、便於閱讀的圖形化方式,其目的就是用易於理解的方式表達復雜信息[5]。(4)圖形組織器是一種視覺化和圖形化的表現方式,用以描述某一學習任務中事實之間、術語之間或觀點之間的關系,具有系列的工具作用,如使學習者思維可視化,使學習者通過探索理解復雜內容的意義,用可視化的方式表徵不同部分之間的連接和關系,如相似性、差異性、序列性等[6]。
對圖形組織器內涵的理解關鍵要把握兩大要義,其一,圖形組織器是一種視圖化或可視化的形式,如各種各樣的圖形或表格結構形式;其二,圖形組織器的目的或功能是促進學習效果或效率,如分類、分析、比較、概念辨析、概括特點、頭腦風暴或提高記憶或檢索。
二、圖形組織器的功能
圖形組織器具有多方面的功能或作用,對不同類型的學習者來說都是一種理想的學習工具。俗話說,一幅圖畫勝過千言萬語。
從學習者角度而言,有研究認為,圖形組織器作為學習工具有助於使之成為一個投入型的學習者,增進學習動力、講究學習策略、習慣交流協作和提高學習的責任感[7]。運用圖形組織器,學習者通過精簡歸納、聚焦強調、解釋演繹等方式,有助於使復雜的、雜亂的信息變為有意義的表現形式;有助於引導信息搜集、目標鎖定、展現所得、表現所缺的方式,保持探究學習活動的方向;通過聚焦思維或活動目標、識別相關站點或領域,起到思維導圖的作用;通過創建圖形組織器,可增進對學習內容的理解、促進對話協作、匯聚觀點和提高決策力,等等[8]。
從促進學習者認知或思維活動發展的角度而言,有研究總結了圖形組織器的10大功能:①總括文本內容(勾勒要點);②確定或闡釋信息(運用圖形輔助或圖解);③表達理解(運用自己的語言復述);④確認和解釋與文本相關的關鍵詞彙;⑤考察分析文本(如要點、人物行為、問題解決、因果關系、事實/意見或觀點);⑥文本推理(如完形閱讀);⑦比較/對比(如人物、場景、事件);⑧對文本的感受(與個體經驗或感情相關聯);⑨選擇(從目標出發選擇恰當的參考資源);⑩驗證對文本的理解(如通過預測結果或行為)[9]。
從學習工具的角度來理解,更有助於從實用的角度完整地把握圖形組織器的功能。總括起來,圖形組織器可作為如下系列學習工具:
(1)結構化或網路化工具。圖形組織器有助於學習者結構化地展現事件、要素或觀點的關聯、模式和關系;有助於學習者圍繞某一主題或論點組織素材或整合知識;有助於勾畫所學內容的基本結構(基本概念以及概念之間的關系);描述與學習主題相關的已有知識結構,並在現有的知識結構加入新概念、新觀點或新知識。按布魯納的結構教學理論來看,掌握學習內容的基本結構是有效學習的主要標志。
(2)記憶、儲存與檢索工具。好的圖形組織器是知識的記憶、儲存和檢索方式,可以充當知識的寄居地或附帶有效的線索提示;可以促進知識的長期記憶。記憶發生時,首先是編碼,如能成為長時記憶,就可持久地儲存,編碼轉換為事件或信息能成為持久的形式[10]。圖形化的呈現方式能刺激學生大腦建立意義並與記憶建立聯系。
(3)知識凝練與聚合工具。圖形組織器高度濃縮大量的知識,提煉知識的核心內容,可以使學習者聚集相關研究以快速分辨哪些是他們更需要的信息,如,學習者可以帶一個准備好的綱要或大綱去圖書館或上網查找資料[11]。
(4)內化與建構工具。當學習者把大量的數據、信息轉換或凝練成某種圖形組織器時,可以幫助理解和闡釋,實現新舊知識的聯系,促進同化與順應,實現知識的綜合或拓展,從而形成自己的觀點或知識組塊等。因為創建圖形組織器的過程,實際上是一個知識的理解、組織、闡釋、反思和修正的過程,是一個與所學內容對象不斷對話的過程。
(5)問題求解工具。圖形組織器有助於學習者分解問題目標,圍繞目標,促進學習者或學習者之間實現頭腦風暴、觀點發散,集聚問題求解的方法、程序、過程或步驟,篩選或優化問題求解的方案,並在問題求解的過程中不斷產生新知識、新問題或新方法,從而培養學習者解決問題的能力。
(6)創造工具。圖形組織器有助於學習者運行發散和聚合思維,實踐創新思維。比如,與線性的文本不同,圖形里的觀點要素或圖解可以任意編排,學習者可以通過反復不斷地調整圖解形式來增添新的想法。
(7)交流與協作工具。知識的學習離不開社會性建構,即社會性交流與協作。一個組織良好的圖形能簡潔明了地表達想法和理解,吸引他人的注意力,且對關鍵內容的記憶也比純語言交流要長久。個體學習者所創建的圖形代表了一種可能的信息或觀念,可用於與他人分享和交流,並為他人增刪信息提供了一種方便的載體。群體學習者所創建的圖形則代表了群組的信息或觀念,圖形組織器充當了發散和聚合群組觀點的有力工具,因為可視化的形式可以及時將分散在個人腦中的靈感組合成一個整體性的結構。在小組學習、項目學習、問題求解等學習活動中,圖形組織器通常是學習者就某一問題展開討論,集合眾人想法的有效工具。
(8)評價工具。圖形組織器有助於學習者檢驗知識獲取過程和結果的質量。一般來說,只有想不清楚,沒有畫不清楚的圖形。如果學習者對所學內容不理解或無法抽象概括,那麼就不可能運用圖形組織器來表示所學內容。通過圖形組織器,不僅可以檢視學習者對所學內容的把握程度,考量學習者的邏輯思維過程和知識面,而且可以診斷學習者在哪些方面存在思維和知識的殘缺。
此外,學習者可以運用圖形組織器充當過程性評價工具,比如,一個圖形組織器作品反映了學習者在某一特定領域內對知識的理解程度,包括知識相互聯系的多樣化程度,學習者可以在創建作品的過程中反思自己對知識的掌握程度,並且實施及時有效的修訂。
三、圖形組織器的理論基礎
圖形組織器為何能有效地促進學習?其學理何在?相關的理論研究揭示了這一問題。概括地說,圖形組織器的理論基礎主要包括雙重編碼理論、腦科學、經驗之塔、學習理論和知識管理。
1.雙重編碼理論
加拿大心理學家佩維奧(Dual Coding Theory,A. Paivio,1984)認為,人類存在著兩個認知子系統,一個是專用於對非語詞事物、事件(即映像)的表徵與處理,另一個則用於語言的處理。由此也就存在兩種不同的表徵單元,即適用於心理映像的「圖像單元」和適用於語言實體的「語言單元」。前者是根據部分與整體的關系組織的,後者是根據聯想與層級組織的。雙重編碼理論可用於許多認知學習,如記憶、問題求解、概念學習和語言習得。而且說明了吉爾福特智力理論中空間能力的重要性,因為大量通過視覺獲得的映像所涉及的正是空間領域的信息。因此,在信息的儲存、加工與提取中,語言與非語言的信息加工過程是同樣重要的。人類可同時運用視覺和語言的形式呈現信息,以增強信息的回憶與識別。
2.腦科學
研究表明,人的大腦分左右兩個半球,其結構幾乎完全一樣,但功能卻不相同。左腦主司語言表達、邏輯思維、數理演繹、字詞記憶、計算和順序、分類、智力和科學;右腦主司非語言表達、創新思維、形象性感知、具體事物記憶、視覺空間觀察、音樂、感覺力和藝術。正是大腦兩半球分工合作的和諧統一,才使大腦發揮高度復雜的整體功能。人類天生就有運用圖像的能力。據研究,大多數的人腦活動涉及到視覺圖像的處理和分析過程,視覺表徵在不同的任務中優於語言表徵。根據現代腦科學的研究,右腦的視覺思維圍繞左腦邏輯思維所求解的難題進行新舊知覺信息的同構活動是復雜的,甚至是無意識的。在無意識活動中,大腦處於一種高度的自由開放態,使新輸入的知覺信息和積淀知覺信息的同構活動十分活躍,容易獲得一個全新的「知覺形象」,反饋給左腦進行邏輯鑒別,如不符合要求,則以新的「目的意象」送給右腦的視覺思維,如此反復多次直至獲得一個符合目的的推論結果。
3.經驗之塔
該理論的提出者是美國視聽教育家戴爾(Cone of Experience,E.Dale,1946;1964)。經驗之塔是一種關於學習經驗分類的理論模型,其表現的學習經驗分為三大類:一是做的「做」的學習經驗,包括有目的的、直接的經驗,設計的經驗和演戲的經驗。二是「觀察」的學習經驗,包括演示、校外學習旅行、展覽、電視電影、廣播、錄音、靜畫。三是「使用符號」的學習經驗,包括視覺符號和言語符號。各類學習經驗是相互聯系、相互滲透。該理論對教學(包括學習者)如何有效處理直接經驗與間接經驗的聯系,解決具體經驗和抽象經驗的矛盾,防止「言語主義」――從概念到概念的現象等問題具有現實意義。圖形組織器具有隸屬或貫穿三類學習經驗的特點,在「做、觀察和使用符號」的學習經驗類別中具有相應的作用。
4.學習理論
圖形組織器的功用可從諸多學習理論中找到強力的支撐。比如,行為主義關注可觀察和測量的外顯學習行為,強調學習是刺激與反應的聯結,注重強化;認知主義認為學習在於內部認知的變化,學習過程是信息加工過程,是認知結構的組織與再組織,強調同化與順應和對學習任務的整體理解,強調直覺思維的作用(直覺思維通常採取圖像方式進行);建構主義認為,學習是學習者在原有認知結構基礎上主動建構的過程或結果,每個人都能生成自己的認知模式和個性化理解。知識是意義建構的結果,知識的建構需要對所學內容進行闡釋、交流、表達或展現,這是建構知識的必要方式,也是檢測知識建構水平的有效方式,知識建構需要運用多樣化的知識外部表徵(包括圖形組織器),需要運用各種學習工具和學習資源展開問題求解活動。
5.知識管理
知識管理是指組織或個人運用相關工具和方法來獲取、存儲、共享、應用和創新知識的過程。每個學習者都是知識管理者,知識管理的效率直接決定學習的效率。從知識獲取到創新的整個過程涉及到顯性與隱性知識的相互轉換,在這些轉換過程中,知識可視化是一種重要的形式和手段。比如,野中郁次郎(Nonaka,1991)認為,將隱性知識顯性化意味著用某種方式來表達只可意會不可言傳的東西,其最有力的工具之一就是知識可視化。知識可視化能使知識更好地被獲取和討論,也有益於更普遍地管理知識。
此外,知識可視化有助於解決組織中一系列與知識有關的重要問題,如知識傳播中的不對稱性,利用啟發性的草圖和豐富的圖像隱喻促進群體知識創新,通過精簡壓縮的方式減輕學習者的信息負荷,等等[12]。
四、圖形組織器的類型
圖形組織器存在許多類型。由於每個圖形組織器都有顯見的外在形式,因此,掌握圖形組織器類型最為直接簡單的方式就是按其外形特徵來劃分。根據相關研究,按照外形特徵,可將圖形組織器劃分為五種,每一種類型都有其主要的功能或用途。如表1所示[13]。
五、圖形組織器的選用
圖形組織器種類繁多,功能多樣,每一種圖形組織器都可以用來支持多種學習或思維發展。選用圖形組織器的關鍵是:一要掌握圖形組織器的類別、功能或主要用途;二要理解學習或思維發展的目的,從而使手段和目的之間建立起映射關系。那麼,圖形組織器可以有效地促進哪些類型的學習或思維發展呢?我們認為,學習者在選用圖形組織器時,可以靈活地運用如下參照框架。
1.以認知目標為選用參照框架
認知目標分類以美國布盧姆的研究最為著名,他們在半個世紀的研究中,先後在推出兩個版本的認知目標分類(1956,2001)。在第一個版本(1956)中,他們把認知目標分為知道、領會、應用、分析、綜合和評價。在第二個版本(2001)中,他們強調了學習者在有意義學習中的主動、認知和建構過程,強調了學習者是如何獲取知識和如何思考的。與第一版的單向分類維度不同,第二版採用了「知識」和「認知過程」二維分類。知識是指學習時涉及的相關內容,從具體到抽象分為四類:事實性知識、概念知識、程序知識和元認知知識;認知過程包含學習時要掌握的學業行為表現,依據認知復雜度由低到高排列包括六個層級:記憶、理解、應用、分析、評價和創造[14]。這兩個版本的認知目標分類均可以作為學習選用圖形組織器的參照框架。如表2所示。
第二版的認知目標的「知識維」和「認知過程維」更可以作為學習者選用圖形組織器的參照框架。比如,就實現知識維來說,學習者可以運用圖形組織器促進事實性知識(術語、具體細節和要素)、概念性知識(類別與分類、原理與概括、理論/模式與結構)、程序性知識(具體學科技能和演算法、技巧和方法知識、確定何時運用適當程序知識)、元認知知識(包括策略、認知任務的知識如情境性和條件性知識、自我知識)。
就認知過程維來說,學習者可運用圖形組織器來展開各種思維活動,促進各種認知目標層級的實現。如,通過識別(確認)、回憶(提取)的圖形組織器工具來促進記憶方面的認知目標實現;通過解釋(轉換、釋義、表徵、澄清)、舉例(例證、例示)、分類(歸類)、總結(概括、抽象)、推斷(外推、添加、預測、斷定)、比較(對照、匹配、映射)、說明(建構一個模型)的圖形組織器工具來促進理解方面的認知目標實現;通過執行(完成)、實施(使用)的圖形組織器工具來促進應用方面的認知目標實現;通過區分(辨別、選擇、區別、聚焦)、組織(形成結構、整合內容、尋求一致、明確要義、語義分析)、歸屬(解構)的圖形組織器工具來促進分析方面的認知目標實現;通過核查(檢驗、查明、監控、協調)、評判(判斷)的圖形組織器工具來促進評價方面的認知目標實現;通過生成(提出假設)、計劃(設計)、實施/產出(構建)的圖形組織器工具來促進創造方面的認知目標實現,等等。
2.以學習維度發展為選用參照框架
學習維度(Dimensions of Learning, DOL)是美國課程改革專家馬扎諾(R. Marzano)提出的一種應用性學習理論。學習維度包括五個維度:維度一是學習者的態度與感受、維度二是獲取與整合知識、維度三是擴展與精練知識、維度四是有意義地運用知識、維度五是生產性的思維習慣[15]。在五個維度中,所有的學習都發生於學習者的態度與感受(維度1)以及運用生產性的思維習慣中(維度5),任何學習過程都帶有情感和態度特徵。另外三個維度則是學習之中進行思考所必需的。在擴展與精練知識時,學習者也在獲取與整合知識;在運用知識時,學習者也在擴展知識。思維技能和思維過程並不是互相割裂和線性作用的,而是一個互動循環、彼此影響的過程。學習的五個維度從總體上實現了認知與情感的相互作用,決定著學習的成效。合理地選用圖形組織器工具能有效地促進學習者獲取與整合知識、擴展與精煉知識和有意義地運用知識。如表3所示。
3.以理性思維發展為選用參照框架
「理性思維」(rational thinking)是美國教育學家坎貝爾(Campbell, 2003)提出的學習能力目標指向[16]。所謂「理性思維」,通常是指深層次理解知識與運用(遷移)知識時的心理活動狀態和信息加工方式。學習或教學應當重視發展「理性思維」能力。以坎貝爾提出的20種理性思維的分類和以提問促進理性思維發展的方式為參照,學習者可以有效地選用圖形組織器。如表4所示。
4.以日常思維發展為選用參照框架
在日常的學習中,會涉及系列常用的思維活動,這些思維活動的特點與圖形組織器存在一種對應的關系。學習者可以運用相應的圖形組織器來促進日常思維活動的發展。如表5所示。
六、圖形組織器的創建原則
1.目標導向
圖形組織器是用來實現一定的認知目標或促進思維能力發展的,否則必將成為一種流於形式的、花里胡哨的裝飾,顛倒手段和目標的關系。目標導向將決定圖形組織器的形式選擇、認知活動展開和圖形組織器的應用成效。為此,學習者要明確學習任務和學習目標,理解圖形組織器選用的參照框架。
2.相互匹配
任何一種圖形組織器都有其特定的形式和功用,學習者面臨的學習內容也有其特定性,比如事實性知識和程序性知識學習的差異。為此,學習者要把握圖形組織器的類型,理解學習內容的特點,實現圖形組織器的形式表現性和學習內容特定性的有機統合。
3.自由開放
圖形組織器有一定的類型和表現形式,但不是僵硬固定的。學習者不要拘泥形式,可以根據自己的喜好、學習任務和目標的特點,在基本匹配的基礎上,自由選用甚至是創新圖形組織器,用於信手塗鴉、頭腦風暴,追求最多樣化的觀點,實現觀點的不斷增刪和圖形的不斷變化。
4.整體結構
不論選用何種圖形組織器,都要高度重視圖形所表現的主題、各個要素及其相互聯系,使圖形化或可視化的對象內容形成一個整體的結構。
5.簡潔有效
使用和創建圖形組織器的目的是化繁為簡、化抽象為具體、化隱性為顯性,一目瞭然,以提高表現力和傳播效果,切忌形式重於內容,喪失圖形組織器的本原意義。
6.視覺設計
圖形組織器是一種視覺信息傳播方式,其效果受影響於相關的設計原則。在視覺設計方面,湯普森(M.Thompson,1994)提出了11條基本要義:簡潔、清晰、平衡、協調、組織性、重點突出、易辨性、統一性、透視性、觀點明確和構架合理。在知識可視化方面,尤德爾曼(G.Judelman,2004)提出了5條基本原則:圖形化(重模型而非無結構的信息)、最優化(注重信息表現力以提高認知效率)、穩定性(注意信息表現和操作的情境)、適應性(注重圖形界面和應用的聚合性)、數字化(以數字化方式來處理復雜性)[17]。這些原則對於使用和創建圖形組織器來說都富有啟示和指導意義。
此外,在創建圖形組織器時離不開創建工具。一般說來,創建圖形組織器的工具主要分為兩種,徒手繪制和數字化方式。徒手繪制的特點是設備簡單、不受場所限制、使用比較靈活和適宜表現瞬間的靈感,但作品較隨意,不易改動和轉移。
數字化的方式就是使用計算機技術,其特點是易於修改、動態鏈接、轉換方便、簡潔美觀、易於儲存、交換和傳播,等等。一般來說,平常的辦公軟體如Office、Wps自帶的繪圖工具就可以用於創建圖形組織器,滿足基本要求。但這種附帶的繪圖工具在圖形模板、色彩等方面可選擇性小,對學習者的構圖能力要求比較高,創建復雜圖形比較費時,也不適合表達復雜信息或思維的要求。因此,學習者可以選用專門的圖形組織器創建工具主要有Inspiration, Mind Manager, Mind Mapper, Brain, Axon Idea Processor, Cmap, Decision Explorer, Kmap, SemNet, Research Group, CoCo Systems, Activity Map, TextVision / TekstNet, SMART Ideas, EGLE Magic等等。這些軟體提供了豐富的圖形模板,界面友好,操作簡單,功能多樣,而且菜單設置、編輯功能等都大同小異,只是對於圖形的繪制有所側重。學習者只要學會一到兩種這類軟體,就可以觸類旁通。
[參考文獻]
[1]Tracey Hall & Nicole. Strangman.Graphic Organizers :A Report Prepared by for the National Center on Accessing the General Curriculum at CAST.[EB/OL].https://www.省略/publications/ncac/ncac_go.html 2009-01-12.
[2][6]Aziz Bin Mohamed Amin.Using Graphic Organizers[J]. ITE TEACHERS』 CONFERENCE 2004 Reflective Practitioners In Action Singapore.2004.10.1.sg/ite_conf/e_tech/tc04et02.pdf
[3]Definition of Graphic organizer.[EB/OL]. https://dictionary.省略/graphic%20organizer 2009-07-10.
[4]what are they. [EB/OL]..ca/priscillatheroux/graphicorganizers.html 2007-09-1.
[5]Graphic Organizers. [EB/OL] .https://www.省略/graphicorganizers/ 2008-06-5.
[7]Jamie McKenzie .Graphical Organizers as Thinking Technology. [EB/OL] .省略/oct97/picture.html 2007-08-7.
[8]Why Graphical Organizers? [EB/OL] .省略/oct97/picture.html;Increasing Understanding by Creating Graphic Organizers,[EB/OL] .https://www.省略/graphicorganizers/star/,2008-08-1.
[9]How and Why Graphic Organizers Work. [EB/OL] .https://www.省略/procts/usareads_info.htm,2008-09-12.
[10]Judy Willis Research-Based Strategies to Ignite Student Learning:Insights from a Neurologist and Classroom Teacher[M]. Association for Supervision & Curriculum Deve 2006.
[11]Wormeli, R. Summarization in Any Subject : 50 Techniques to Improve Student Learning[M]. Alexandria, VA: ASCD 2005.
[12]邱婷,知識可視化作為學習工具的應用研究[D],江西師范大學課程與教學研究所,2006:9-14.
[13]Graphic Organizers. [EB/OL]. https://www.省略/organizers/ 2009-09-1.
[14]鍾志賢,大學教學模式革新: 教學設計 視域[M].北京:教育科學出版社,2007:151-152.
[15]MCREL. What is Dimensions of Learning and How is it Used? [EB/OL] . /whathow.asp,2006-11-10.
[16]CAMPBELL L. Mindful Learning:101 Proven Strategies for Student and Teacher Success[M]. Thousand Oaks, CA: Gorwin Press,Inc, 2003: 77, 64-65.
[17]Gregory Brian Judelman(2004).Knowledge Visualization:Problems and Principles for Mapping the Knowledge Space.[EB/OL]. https://www.省略/media/judelmanThesis2004.pdf,2009-08-20.省略);鍾志賢,博士,教授,江西師范大學課程與教學研究所所長,主要從事教育技術學、課程與教學論研究。
On Graphic Organizers
Qiu TingZhong Zhixian
(Institute of Curriculum and Instruction, Jiangxi Normal University,Jiangxi Nanchang 330027)
【Abstract】 Graphic Organizers can be used as a powerful visualized learning tool, be controlled freely by the learner. This paper discusses the meaning, functions, theoretical foundations, types, some frameworks for selection and application(FSA) and some principles of creating graphic organizers, in an attempt to get the basic knowledge about the graphic organizer.
【Keywords】 Graphic organizers; Functions; Types; FSA; Principles of creation
本文責編:孫愛萍
❸ 機器學習的常用方法有哪些
梯度下降是非常常用的優化演算法。作為機器學習的基礎知識,這是一個必須要掌握的演算法。藉助本文,讓我們來一起詳細了解一下這個演算法。
前言
本文的代碼可以到我的Github上獲取:
https://github.com/paulQuei/gradient_descent
本文的演算法示例通過Python語言實現,在實現中使用到了numpy和matplotlib。如果你不熟悉這兩個工具,請自行在網上搜索教程。
關於優化
大多數學習演算法都涉及某種形式的優化。優化指的是改變x以最小化或者最大化某個函數的任務。
我們通常以最小化指代大多數最優化問題。最大化可經由最小化來實現。
我們把要最小化或最大化的函數成為目標函數(objective function)或准則(criterion)。
我們通常使用一個上標*表示最小化或最大化函數的x值,記做這樣:
[x^* = arg; min; f(x)]
優化本身是一個非常大的話題。如果有興趣,可以通過《數值優化》和《運籌學》的書籍進行學習。
模型與假設函數
所有的模型都是錯誤的,但其中有些是有用的。– George Edward Pelham Box
模型是我們對要分析的數據的一種假設,它是為解決某個具體問題從老洞數據中學習到的,因此它是機器學習最核心的概念。
針對一個問題,通常有大量的模型可以選擇。
本文不會深入討論這方面的內容,關於各種模型請參閱機器學習的相關書籍。本文僅以最簡單的線性模型為基礎來討論梯度下降演算法。
這里我們先介紹一下在監督學習(supervised learning)中常見的三個符號:
m,描述訓練樣本的數量
x,描述輸入變數或特徵
y,描述輸出變數或者叫目標值
訓練集會包含很多的樣本,我們用 表示其中第i個樣本。
x是數據樣本的特徵,y是其目標值。例如,在預測房價的模型中,x是房子的各種信息,例如:面積,樓層,位置等等,y是房子的價格。在圖像識別的任務中,x是圖形的所有像素點數據,y是圖像中包含的目標對象。
我們是希望尋找一個函數,將x映射到y,這個函數要足夠的好,以至於能夠預測對應的y。由於歷史原因,這個函數叫做假設函數(hypothesis function)。
學習的過程如下圖所示。即:首先根據已有的數據(稱之為訓練集)訓練我們的演算法模型,然後根據模型的假設函數來進行新數據的預測。
線性模型(linear model)正如其名稱那樣:是希望通過一個直線的形式來描述模式。線性模型的假設函數如下所示:
[h_{ heta}(x) = heta_{0} + heta_{1} * x]
這個公式對於大家來說應該都是非常簡單的。如果把它繪制出來,其實就是一條直線。
下圖是一個具體的例子,即: 的圖形:
在實際的機器學習工程中碰含伍,你會擁有大量的數據。這些數據會來自於某個數據源。它們存儲在csv文件中,或者以其他的形式打包。
但是本文作為演示使用,我們通過一些簡單的代碼自動生成了需要的數據。為了便於計算,演示的數據量也很小。
import numpy as np
max_x = 10
data_size = 10
theta_0 = 5
theta_1 = 2
def get_data:
x = np.linspace(1, max_x, data_size)
noise = np.random.normal(0, 0.2, len(x))
y = theta_0 + theta_1 * x + noise
return x, y
這段代碼很簡單,我們生成了x范圍是 [1, 10] 整數的10條數據。對應的y是以線性模型的形式計算得到,其函數是:。現實中的數據常常受到各種因素的干擾,所以對於y我們故意加上了一些高斯雜訊。因此最終的y值為比原先會有輕微的偏離。
最後我們的數據如下所示:
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [6.66, 9.11, 11.08, 12.67, 15.12, 16.76, 18.75, 21.35, 22.77, 24.56]
我們可以把這10條數據繪制出來這樣就有一個直觀的了解了,如下圖所示:
雖然演示用的數據是我們通過公式計算得到的。但在實際的工程中,模型的參數是需要我們通過數據學習到的。所以下文我們假設我們不知道這里線性模式的兩個參數是什麼,而是通過演算法的形式求得。
最後再跟已知的參數進行對比以驗證我們的演算法是否正確。
有了上面的數據,我們可以嘗試畫一條直線來描述我們的模型。
例如,像下面這樣畫一條水平的直線:
很顯然,這條水平線離數據太遠了,非常的不匹配。
那我們可以再畫一條斜線。
我們初次畫的斜線可能也不貼切,它可能像下面這樣:
最後我們通過不斷嘗試,找到了最終最合適的那條,如下所示:
梯度下降演算法的計算過程,就和這種本能式的試探是類似的,它就是不停的迭代,一步步的接近最終的結果。
代價函數
上面我們嘗試了幾次通過一條直線來擬合(fitting)已有的數據。
二維平面上的一條直線可以通過兩個參數唯一的確定,兩個參數的確定也即模型的確定。那如何描述模型與數據的擬合程度呢?答案就是代價函數。
代價函數(cost function)描述了學習到的模型與實際結果的偏差程度。以上面的三幅圖為例,最後一幅圖中的紅線相比第一條水平的綠線,其偏離程度(代價)應該是更小的。
很顯然,我們希望我們的假設函數與數據盡可能的貼近,也就是說:希望代價函數的結果盡可能的小。這就涉及到結果的優化,而梯度下降就是尋找最小值的方法之一。
對於每一個樣本,假設函數會依據計算出一個估算值,我們常常用來表示。即 。
很自然的,我們會想到,通過下面這個公式來描述我們的模型與實際值的偏差程度:
[(h_ heta(x^i) - y^i)^2 = (widehat{y}^{i} - y^i)^2 = ( heta_{0} + heta_{1} * x^{i} - y^{i})^2]
請注意, 是實際數據的值, 是我們的模型的估算值。前者對應了上圖中的離散點的y坐標,後者對應了離散點在直線上投影點的y坐標。
每一條數據都會存在一個偏差值,而代價函數就是對所有樣本的偏差求平均值,其計算公式如下所示:
[L( heta) = frac {1}{m} sum_{i=1}^{m}(h_ heta(x^i) - y^i)^2 = frac {1}{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i})^2]
當損失函數的結果越小,則意味著通過我們的假設函數估算出的結果與真實值越接近。這也就是為什麼我們要最小化損失函數的原因。
藉助上面這個公式,我們可以寫一個函數來實現代價函數:
def cost_function(x, y, t0, t1):
cost_sum = 0
for i in range(len(x)):
cost_item = np.power(t0 + t1 * x[i] - y[i], 2)
cost_sum += cost_item
return cost_sum / len(x)
這個函數的代碼應該不用多做解釋,它就是根據上面的完成計算。
我們可以嘗試選取不同的 和 組合來計算代價函數的值,然後將結果繪制出來:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
theta_0 = 5
theta_1 = 2
def draw_cost(x, y):
fig = plt.figure(figsize=(10, 8))
ax = fig.gca(projection='3d')
scatter_count = 100
radius = 1
t0_range = np.linspace(theta_0 - radius, theta_0 + radius, scatter_count)
t1_range = np.linspace(theta_1 - radius, theta_1 + radius, scatter_count)
cost = np.zeros((len(t0_range), len(t1_range)))
for a in range(len(t0_range)):
for b in range(len(t1_range)):
cost[a][b] = cost_function(x, y, t0_range[a], t1_range[b])
t0, t1 = np.meshgrid(t0_range, t1_range)
ax.set_xlabel('theta_0')
ax.set_ylabel('theta_1')
ax.plot_surface(t0, t1, cost, cmap=cm.hsv)
在這段代碼中,我們對 和 各自指定了一個范圍進行100次的采樣,然後以不同的 組合對來計算代價函數的值。
如果我們將所有點的代價函數值繪制出來,其結果如下圖所示:
從這個圖形中我們可以看出,當 越接近 [5, 2]時其結果(偏差)越小。相反,離得越遠,結果越大。
直觀解釋
從上面這幅圖中我們可以看出,代價函數在不同的位置結果大小不同。
從三維的角度來看,這就和地面的高低起伏一樣。最高的地方就好像是山頂。
而我們的目標就是:從任意一點作為起點,能夠快速尋找到一條路徑並以此到達圖形最低點(代價值最小)的位置。
而梯度下降的演算法過程就和我們從山頂想要快速下山的做法是一樣的。
在生活中,我們很自然會想到沿著最陡峭的路往下行是下山速度最快的。如下面這幅圖所示:
針對這幅圖,細心的讀者可能很快就會有很多的疑問,例如:
對於一個函數,怎麼確定下行的方向?
每一步該往前走多遠?
有沒有可能停留在半山腰的平台上?
這些問題也就是本文接下來要討論的內容。
演算法描述
梯度下降演算法最開始的一點就是需要確定下降的方向,即:梯度。
我們常常用 來表示梯度。
對於一個二維空間的曲線來說,梯度就是其切線的方向。如下圖所示:
而對於更高維空間的函數來說,梯度由所有變數的偏導數決定。
其表達式如下所示:
[ abla f({ heta}) = ( frac{partial f({ heta})}{partial heta_1} , frac{partial f({ heta})}{partial heta_2} , ... , frac{partial f({ heta})}{partial heta_n} )]
在機器學習中,我們主要是用梯度下降演算法來最小化代價函數,記做:
[ heta ^* = arg min L( heta)]
其中,L是代價函數,是參數。
梯度下降演算法的主體邏輯很簡單,就是沿著梯度的方向一直下降,直到參數收斂為止。
記做:
[ heta ^{k + 1}_i = heta^{k}_i - lambda abla f( heta^{k})]
這里有幾點需要說明:
收斂是指函數的變化率很小。具體選擇多少合適需要根據具體的項目來確定。在演示項目中我們可以選擇0.01或者0.001這樣的值。不同的值將影響演算法的迭代次數,因為在梯度下降的最後,我們會越來越接近平坦的地方,這個時候函數的變化率也越來越小。如果選擇一個很小的值,將可能導致演算法迭代次數暴增。
公式中的 稱作步長,也稱作學習率(learning rate)。它決定了每一步往前走多遠,關於這個值我們會在下文中詳細講解。你可以暫時人為它是一個類似0.01或0.001的固定值。
在具體的項目,我們不會讓演算法無休止的運行下去,所以通常會設置一個迭代次數的最大上限。
線性回歸的梯度下降
有了上面的知識,我們可以回到線性模型代價函數的梯度下降演算法實現了。
首先,根據代價函數我們可以得到梯度向量如下:
[ abla f({ heta}) = (frac{partial L( heta)}{ partial heta_{0}}, frac{ partial L( heta)}{ partial heta_{1}}) = (frac {2}{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) , frac {2}{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) x^{i})]
接著,將每個偏導數帶入迭代的公式中,得到:
[ heta_{0} := heta_{0} - lambda frac{partial L( heta_{0})}{ partial heta_{0}} = heta_{0} - frac {2 lambda }{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) heta_{1} := heta_{1} - lambda frac{partial L( heta_{1})}{ partial heta_{1}} = heta_{1} - frac {2 lambda }{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) x^{i}]
由此就可以通過代碼實現我們的梯度下降演算法了,演算法邏輯並不復雜:
learning_rate = 0.01
def gradient_descent(x, y):
t0 = 10
t1 = 10
delta = 0.001
for times in range(1000):
sum1 = 0
sum2 = 0
for i in range(len(x)):
sum1 += (t0 + t1 * x[i] - y[i])
sum2 += (t0 + t1 * x[i] - y[i]) * x[i]
t0_ = t0 - 2 * learning_rate * sum1 / len(x)
t1_ = t1 - 2 * learning_rate * sum2 / len(x)
print('Times: {}, gradient: [{}, {}]'.format(times, t0_, t1_))
if (abs(t0 - t0_) < delta and abs(t1 - t1_) < delta):
print('Gradient descent finish')
return t0_, t1_
t0 = t0_
t1 = t1_
print('Gradient descent too many times')
return t0, t1
這段代碼說明如下:
我們隨機選擇了 都為10作為起點
設置最多迭代1000次
收斂的范圍設為0.001
學習步長設為0.01
如果我們將演算法迭代過程中求得的線性模式繪制出來,可以得到下面這幅動態圖:
最後演算法得到的結果如下:
Times: 657, gradient: [5.196562662718697, 1.952931052920264]
Times: 658, gradient: [5.195558390180733, 1.9530753071808193]
Times: 659, gradient: [5.194558335124868, 1.9532189556399233]
Times: 660, gradient: [5.193562479839619, 1.9533620008416623]
Gradient descent finish
從輸出中可以看出,演算法迭代了660次就收斂了。這時的結果[5.193562479839619, 1.9533620008416623],這已經比較接近目標值 [5, 2]了。如果需要更高的精度,可以將delta的值調的更小,當然,此時會需要更多的迭代次數。
高維擴展
雖然我們舉的例子是二維的,但是對於更高維的情況也是類似的。同樣是根據迭代的公式進行運算即可:
[ heta_{i} = heta_{i} - lambda frac {partial L( heta)}{partial heta_i} = heta_{i} - frac{2lambda}{m} sum_{i=1}^{m}(h_ heta(x^{k})-y^k)x_i^k]
這里的下標i表示第i個參數,上標k表示第k個數據。
梯度下降家族BGD
在上面的內容中我們看到,演算法的每一次迭代都需要把所有樣本進行遍歷處理。這種做法稱為之Batch Gradient Descent,簡稱BGD。作為演示示例只有10條數據,這是沒有問題的。
但在實際的項目中,數據集的數量可能是幾百萬幾千萬條,這時候每一步迭代的計算量就會非常的大了。
於是就有了下面兩個變種。
SGD
Stochastic Gradient Descent,簡稱SGD,這種演算法是每次從樣本集中僅僅選擇一個樣本來進行計算。很顯然,這樣做演算法在每一步的計算量一下就少了很多。
其演算法公式如下:
[ heta_{i} = heta_{i} - lambda frac {partial L( heta)}{partial heta_i} = heta_{i} - lambda(h_ heta(x^k)-y^k)x_i^k]
當然,減少演算法計算量也是有代價的,那就是:演算法結果會強依賴於隨機取到的數據情況,這可能會導致演算法的最終結果不太令人滿意。
MBGD
以上兩種做法其實是兩個極端,一個是每次用到了所有數據,另一個是每次只用一個數據。
我們自然就會想到兩者取其中的方法:每次選擇一小部分數據進行迭代。這樣既避免了數據集過大導致每次迭代計算量過大的問題,也避免了單個數據對演算法的影響。
這種演算法稱之為Mini-batch Gradient Descent,簡稱MBGD。
其演算法公式如下:
[ heta_{i} = heta_{i} - lambda frac {partial L( heta)}{partial heta_i} = heta_{i} - frac{2lambda}{m} sum_{i=a}^{a + b}(h_ heta(x^k)-y^k)x_i^k]
當然,我們可以認為SGD是Mini-batch為1的特例。
針對上面提到的演算法變種,該如何選擇呢?
下面是Andrew Ng給出的建議:
如果樣本數量較小(例如小於等於2000),選擇BGD即可。
如果樣本數量很大,選擇 來進行MBGD,例如:64,128,256,512。
下表是 Optimization for Deep Learning 中對三種演算法的對比
方法准確性更新速度內存佔用在線學習BGD好慢高否SGD好(with annealing)快低是MBGD好中等中等是
演算法優化
式7是演算法的基本形式,在這個基礎上有很多人進行了更多的研究。接下來我們介紹幾種梯度下降演算法的優化方法。
Momentum
Momentum是動量的意思。這個演算法的思想就是藉助了動力學的模型:每次演算法的迭代會使用到上一次的速度作為依據。
演算法的公式如下:
[v^t = gamma v^{t - 1} + lambda abla f( heta) heta = heta - v_t]
對比式7可以看出,這個演算法的主要區別就是引入了,並且,每個時刻的受前一個時刻的影響。
從形式上看,動量演算法引入了變數 v 充當速度角色——它代表參數在參數空間移動的方向和速率。速度被設為負梯度的指數衰減平均。名稱動量來自物理類比,根據牛頓運動定律,負梯度是移動參數空間中粒子的力。動量在物理學上定義為質量乘以速度。在動量學習演算法中,我們假設是單位質量,因此速度向量 v 也可以看作是粒子的動量。
對於可以取值0,而是一個常量,設為0.9是一個比較好的選擇。
下圖是momentum演算法的效果對比:
對原來的演算法稍加修改就可以增加動量效果:
def gradient_descent_with_momentum(x, y):
t0 = 10
t1 = 10
delta = 0.001
v0 = 0
v1 = 0
gamma = 0.9
for times in range(1000):
sum1 = 0
sum2 = 0
for i in range(len(x)):
sum1 += (t0 + t1 * x[i] - y[i])
sum2 += (t0 + t1 * x[i] - y[i]) * x[i]
v0 = gamma * v0 + 2 * learning_rate * sum1 / len(x)
v1 = gamma * v1 + 2 * learning_rate * sum2 / len(x)
t0_ = t0 - v0
t1_ = t1 - v1
print('Times: {}, gradient: [{}, {}]'.format(times, t0_, t1_))
if (abs(t0 - t0_) < delta and abs(t1 - t1_) < delta):
print('Gradient descent finish')
return t0_, t1_
t0 = t0_
t1 = t1_
print('Gradient descent too many times')
return t0, t1
以下是該演算法的輸出:
Times: 125, gradient: [4.955453758569991, 2.000005017897775]
Times: 126, gradient: [4.955309381126545, 1.9956928964532015]
Times: 127, gradient: [4.9542964317327005, 1.9855674828684156]
Times: 128, gradient: [4.9536358220657, 1.9781180992510465]
Times: 129, gradient: [4.95412496254411, 1.9788858350530971]
Gradient descent finish
從結果可以看出,改進的演算法只用了129次迭代就收斂了。速度比原來660次快了很多。
同樣的,我們可以把演算法計算的過程做成動態圖:
對比原始的演算法過程可以看出,改進演算法最大的區別是:在尋找目標值時會在最終結果上下跳動,但是越往後跳動的幅度越小,這也就是動量所產生的效果。
Learning Rate 優化
至此,你可能還是好奇該如何設定學習率的值。
事實上,這個值的選取需要一定的經驗或者反復嘗試才能確定。
關鍵在於,這個值的選取不能過大也不能過小。
如果這個值過小,會導致每一次迭代的步長很小,其結果就是演算法需要迭代非常多的次數。
那麼,如果這個值過大會怎麼樣呢?其結果就是:演算法可能在結果的周圍來回震盪,卻落不到目標的點上。下面這幅圖描述了這個現象:
事實上,學習率的取值未必一定要是一個常數,關於這個值的設定有很多的研究。
下面是比較常見的一些改進演算法。
AdaGrad
AdaGrad是Adaptive Gradient的簡寫,該演算法會為每個參數設定不同的學習率。它使用歷史梯度的平方和作為基礎來進行計算。
其演算法公式如下:
[ heta_i = heta_i - frac{lambda}{sqrt{G_t + epsilon}} abla f( heta)]
對比式7,這里的改動就在於分號下面的根號。
根號中有兩個符號,第二個符號比較好理解,它就是為了避免除0而人為引入的一個很小的常數,例如可以設為:0.001。
第一個符號的表達式展開如下:
[G_t = sum_{i = 1}^{t} abla f( heta){i} abla f( heta){i}^{T}]
這個值其實是歷史中每次梯度的平方的累加和。
AdaGrad演算法能夠在訓練中自動的對learning rate進行調整,對於出現頻率較低參數採用較大的學習率;相反,對於出現頻率較高的參數採用較小的學習率。因此,Adagrad非常適合處理稀疏數據。
但該演算法的缺點是它可能導致學習率非常小以至於演算法收斂非常的慢。
關於這個演算法的直觀解釋可以看李宏毅教授的視頻課程:ML Lecture 3-1: Gradient Descent。
RMSProp
RMS是Root Mean Square的簡寫。RMSProp是AI教父Geoff Hinton提出的一種自適應學習率方法。AdaGrad會累加之前所有的梯度平方,而RMSProp僅僅是計算對應的平均值,因此可緩解Adagrad演算法學習率下降較快的問題。
該演算法的公式如下:
[E[ abla f( heta_{i})^2]^{t} = gamma E[ abla f( heta_{i})^2]^{t - 1} + (1-gamma)( abla f( heta_{i})^{t})^{2} heta_i = heta_i - frac{lambda}{sqrt{E[g^2]^{t+1} + epsilon}} abla f( heta_{i})]
類似的,是為了避免除0而引入。 是衰退參數,通常設為0.9。
這里的 是t時刻梯度平方的平均值。
Adam
Adam是Adaptive Moment Estimation的簡寫。它利用梯度的一階矩估計和二階矩估計動態調整每個參數的學習率。
Adam的優點主要在於經過偏置校正後,每一次迭代學習率都有個確定范圍,使得參數比較平穩。
該演算法公式如下:
[m^{t} = eta_{1} m^{t-1} + (1-eta_{1}) abla f( heta) v^{t} = eta_{2} v^{t-1} + (1-eta_{2}) abla f( heta)^2 widehat{m}^{t} = frac{m^{t}}{1 - eta^{t}_1} widehat{v}^{t} = frac{v^{t}}{1 - eta^{t}_2} heta = heta - frac{lambda}{sqrt{widehat{v}^{t}} + epsilon}widehat{m}^{t}]
,分別是對梯度的一階矩估計和二階矩估計。, 是對,的校正,這樣可以近似為對期望的無偏估計。
Adam演算法的提出者建議 默認值為0.9,默認值為0.999,默認值為 。
在實際應用中 ,Adam較為常用,它可以比較快地得到一個預估結果。
優化小結
這里我們列舉了幾種優化演算法。它們很難說哪種最好,不同的演算法適合於不同的場景。在實際的工程中,可能需要逐個嘗試一下才能確定選擇哪一個,這個過程也是目前現階段AI項目要經歷的工序之一。
實際上,該方面的研究遠不止於此,如果有興趣,可以繼續閱讀 《Sebastian Ruder: An overview of gradient descent optimization algorithms》 這篇論文或者 Optimization for Deep Learning 這個Slides進行更多的研究。
由於篇幅所限,這里不再繼續展開了。
演算法限制
梯度下降演算法存在一定的限制。首先,它要求函數必須是可微分的,對於不可微的函數,無法使用這種方法。
除此之外,在某些情況下,使用梯度下降演算法在接近極值點的時候可能收斂速度很慢,或者產生Z字形的震盪。這一點需要通過調整學習率來迴避。
另外,梯度下降還會遇到下面兩類問題。
局部最小值
局部最小值(Local Minima)指的是,我們找到的最小值僅僅是一個區域內的最小值,而並非全局的。由於演算法的起點是隨意取的,以下面這個圖形為例,我們很容易落到局部最小值的點裡面。
這就是好像你從上頂往下走,你第一次走到的平台未必是山腳,它有可能只是半山腰的一個平台的而已。
演算法的起點決定了演算法收斂的速度以及是否會落到局部最小值上。
壞消息是,目前似乎沒有特別好的方法來確定選取那個點作為起點是比較好的,這就有一點看運氣的成分了。多次嘗試不同的隨機點或許是一個比較好的方法,這也就是為什麼做演算法的優化這項工作是特別消耗時間的了。
但好消息是:
對於凸函數或者凹函數來說,不存在局部極值的問題。其局部極值一定是全局極值。
最近的一些研究表明,某些局部極值並沒有想像中的那麼糟糕,它們已經非常的接近全局極值所帶來的結果了。
鞍點
除了Local Minima,在梯度下降的過程中,還有可能遇到另外一種情況,即:鞍點(Saddle Point)。鞍點指的是我們找到點某個點確實是梯度為0,但它卻不是函數的極值,它的周圍既有比它小的值,也有比它大的值。這就好像馬鞍一樣。
如下圖所示:
多類隨機函數表現出以下性質:在低維空間中,局部極值很普遍。但在高維空間中,局部極值比較少見,而鞍點則很常見。
不過對於鞍點,可以通過數學方法Hessian矩陣來確定。關於這點,這里就不再展開了,有興趣的讀者可以以這里提供的幾個鏈接繼續探索。
參考資料與推薦讀物
Wikipeida: Gradient descent
Sebastian Ruder: An overview of gradient descent optimization algorithms
吳恩達:機器學習
吳恩達:深度學習
Peter Flach:機器學習
李宏毅 - ML Lecture 3-1: Gradient Descent
PDF: 李宏毅 - Gradient Descent
Intro to optimization in deep learning: Gradient Descent
Intro to optimization in deep learning: Momentum, RMSProp and Adam
Stochastic Gradient Descent – Mini-batch and more
劉建平Pinard - 梯度下降(Gradient Descent)小結
多元函數的偏導數、方向導數、梯度以及微分之間的關系思考
[Machine Learning] 梯度下降法的三種形式BGD、SGD以及MBGD
❹ 根號a-+5的最小值和a的值
梯度下降是非常常用的優化演算法。作為機器學習的基礎知識,這是一個必須要掌握的演算法。藉助本文,讓我們來一起詳細了解一下這個演算法。
前言
本文的代碼可以到我的Github上獲取:
https://github.com/paulQuei/gradient_descent
本文的演算法示例通過Python語言實現,在實現中使用到了numpy和matplotlib。如果你不熟悉這兩個工具,請自行在網上搜索教程。
關於優化
大多數學習演算法都涉及某種形式的優化。優化指的是改變x以最小化或者最大化某個函數的任務。
我們通常以最小化指代大多數最優化問題。最大化可經由最小化來實現。
我們把要最小化或最大化的函數成為目標函數(objective function)或准則(criterion)。
我們通常使用一個上標*表示最小化或最大化函數的x值,記做這樣:
[x^* = arg; min; f(x)]
優化本身是一個非常大的話題。如果有興趣,可以通過《數值優化》和《運籌學》的書籍進行學習。
模型與假設函數
所有的模型都是錯誤的,但其中有些是有用的。– George Edward Pelham Box
模型是我們對要分析的數據的一種假設,它是為解決某個具體問題從數據中學習到的,因此它是機器學習最核心的概念。
針對一個問題,通常有大量的模型可以選擇。
本文不會深入討論這方面的內容,關於各種模型請參閱機器學習的相關書籍。本文僅以最簡單的線性模型為基礎來討論梯度下降演算法。
這里我們先介紹一下在監督學習(supervised learning)中常見的三個符號:
m,描述訓練樣本的數量
x,描述輸入變數或特徵
y,描述輸出變數或者叫目標值
訓練集會包含很多的樣本,我們用 表示其中第i個樣本。
x是數據樣本的特徵,y是其目標值。例如,在預測房價的模型中,x是房子的各種信息,例如:面積,樓層,位置等等,y是房子的價格。在圖像識別的任務中,x是圖形的所有像素點數據,y是圖像中包含的目標對象。
我們是希望尋找一個函數,將x映射到y,這個函數要足夠的好,以至於能夠預測對應的y。由於歷史原因,這個函數叫做假設函數(hypothesis function)。
學習的過程如下圖所示。即:首先根據已有的數據(稱之為訓練集)訓練我們的演算法模型,然後根據模型的假設函數來進行新數據的預測。
線性模型(linear model)正如其名稱那樣:是希望通過一個直線的形式來描述模式。線性模型的假設函數如下所示:
[h_{ heta}(x) = heta_{0} + heta_{1} * x]
這個公式對於大家來說應該都是非常簡單的。如果把它繪制出來,其實就是一條直線。
下圖是一個具體的例子,即: 的圖形:
在實際的機器學習工程中,你會擁有大量的數據。這些數據會來自於某個數據源。它們存儲在csv文件中,或者以其他的形式打包。
但是本文作為演示使用,我們通過一些簡單的代碼自動生成了需要的數據。為了便於計算,演示的數據量也很小。
import numpy as np
max_x = 10
data_size = 10
theta_0 = 5
theta_1 = 2
def get_data:
x = np.linspace(1, max_x, data_size)
noise = np.random.normal(0, 0.2, len(x))
y = theta_0 + theta_1 * x + noise
return x, y
這段代碼很簡單,我們生成了x范圍是 [1, 10] 整數的10條數據。對應的y是以線性模型的形式計算得到,其函數是:。現實中的數據常常受到各種因素的干擾,所以對於y我們故意加上了一些高斯雜訊。因此最終的y值為比原先會有輕微的偏離。
最後我們的數據如下所示:
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [6.66, 9.11, 11.08, 12.67, 15.12, 16.76, 18.75, 21.35, 22.77, 24.56]
我們可以把這10條數據繪制出來這樣就有一個直觀的了解了,如下圖所示:
雖然演示用的數據是我們通過公式計算得到的。但在實際的工程中,模型的參數是需要我們通過數據學習到的。所以下文我們假設我們不知道這里線性模式的兩個參數是什麼,而是通過演算法的形式求得。
最後再跟已知的參數進行對比以驗證我們的演算法是否正確。
有了上面的數據,我們可以嘗試畫一條直線來描述我們的模型。
例如,像下面這樣畫一條水平的直線:
很顯然,這條水平線離數據太遠了,非常的不匹配。
那我們可以再畫一條斜線。
我們初次畫的斜線可能也不貼切,它可能像下面這樣:
最後我們通過不斷嘗試,找到了最終最合適的那條,如下所示:
梯度下降演算法的計算過程,就和這種本能式的試探是類似的,它就是不停的迭代,一步步的接近最終的結果。
代價函數
上面我們嘗試了幾次通過一條直線來擬合(fitting)已有的數據。
二維平面上的一條直線可以通過兩個參數唯一的確定,兩個參數的確定也即模型的確定。那如何描述模型與數據的擬合程度呢?答案就是代價函數。
代價函數(cost function)描述了學習到的模型與實際結果的偏差程度。以上面的三幅圖為例,最後一幅圖中的紅線相比第一條水平的綠線,其偏離程度(代價)應該是更小的。
很顯然,我們希望我們的假設函數與數據盡可能的貼近,也就是說:希望代價函數的結果盡可能的小。這就涉及到結果的優化,而梯度下降就是尋找最小值的方法之一。
對於每一個樣本,假設函數會依據計算出一個估算值,我們常常用來表示。即 。
很自然的,我們會想到,通過下面這個公式來描述我們的模型與實際值的偏差程度:
[(h_ heta(x^i) - y^i)^2 = (widehat{y}^{i} - y^i)^2 = ( heta_{0} + heta_{1} * x^{i} - y^{i})^2]
請注意, 是實際數據的值, 是我們的模型的估算值。前者對應了上圖中的離散點的y坐標,後者對應了離散點在直線上投影點的y坐標。
每一條數據都會存在一個偏差值,而代價函數就是對所有樣本的偏差求平均值,其計算公式如下所示:
[L( heta) = frac {1}{m} sum_{i=1}^{m}(h_ heta(x^i) - y^i)^2 = frac {1}{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i})^2]
當損失函數的結果越小,則意味著通過我們的假設函數估算出的結果與真實值越接近。這也就是為什麼我們要最小化損失函數的原因。
藉助上面這個公式,我們可以寫一個函數來實現代價函數:
def cost_function(x, y, t0, t1):
cost_sum = 0
for i in range(len(x)):
cost_item = np.power(t0 + t1 * x[i] - y[i], 2)
cost_sum += cost_item
return cost_sum / len(x)
這個函數的代碼應該不用多做解釋,它就是根據上面的完成計算。
我們可以嘗試選取不同的 和 組合來計算代價函數的值,然後將結果繪制出來:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
theta_0 = 5
theta_1 = 2
def draw_cost(x, y):
fig = plt.figure(figsize=(10, 8))
ax = fig.gca(projection='3d')
scatter_count = 100
radius = 1
t0_range = np.linspace(theta_0 - radius, theta_0 + radius, scatter_count)
t1_range = np.linspace(theta_1 - radius, theta_1 + radius, scatter_count)
cost = np.zeros((len(t0_range), len(t1_range)))
for a in range(len(t0_range)):
for b in range(len(t1_range)):
cost[a][b] = cost_function(x, y, t0_range[a], t1_range[b])
t0, t1 = np.meshgrid(t0_range, t1_range)
ax.set_xlabel('theta_0')
ax.set_ylabel('theta_1')
ax.plot_surface(t0, t1, cost, cmap=cm.hsv)
在這段代碼中,我們對 和 各自指定了一個范圍進行100次的采樣,然後以不同的 組合對來計算代價函數的值。
如果我們將所有點的代價函數值繪制出來,其結果如下圖所示:
從這個圖形中我們可以看出,當 越接近 [5, 2]時其結果(偏差)越小。相反,離得越遠,結果越大。
直觀解釋
從上面這幅圖中我們可以看出,代價函數在不同的位置結果大小不同。
從三維的角度來看,這就和地面的高低起伏一樣。最高的地方就好像是山頂。
而我們的目標就是:從任意一點作為起點,能夠快速尋找到一條路徑並以此到達圖形最低點(代價值最小)的位置。
而梯度下降的演算法過程就和我們從山頂想要快速下山的做法是一樣的。
在生活中,我們很自然會想到沿著最陡峭的路往下行是下山速度最快的。如下面這幅圖所示:
針對這幅圖,細心的讀者可能很快就會有很多的疑問,例如:
對於一個函數,怎麼確定下行的方向?
每一步該往前走多遠?
有沒有可能停留在半山腰的平台上?
這些問題也就是本文接下來要討論的內容。
演算法描述
梯度下降演算法最開始的一點就是需要確定下降的方向,即:梯度。
我們常常用 來表示梯度。
對於一個二維空間的曲線來說,梯度就是其切線的方向。如下圖所示:
而對於更高維空間的函數來說,梯度由所有變數的偏導數決定。
其表達式如下所示:
[ abla f({ heta}) = ( frac{partial f({ heta})}{partial heta_1} , frac{partial f({ heta})}{partial heta_2} , ... , frac{partial f({ heta})}{partial heta_n} )]
在機器學習中,我們主要是用梯度下降演算法來最小化代價函數,記做:
[ heta ^* = arg min L( heta)]
其中,L是代價函數,是參數。
梯度下降演算法的主體邏輯很簡單,就是沿著梯度的方向一直下降,直到參數收斂為止。
記做:
[ heta ^{k + 1}_i = heta^{k}_i - lambda abla f( heta^{k})]
這里有幾點需要說明:
收斂是指函數的變化率很小。具體選擇多少合適需要根據具體的項目來確定。在演示項目中我們可以選擇0.01或者0.001這樣的值。不同的值將影響演算法的迭代次數,因為在梯度下降的最後,我們會越來越接近平坦的地方,這個時候函數的變化率也越來越小。如果選擇一個很小的值,將可能導致演算法迭代次數暴增。
公式中的 稱作步長,也稱作學習率(learning rate)。它決定了每一步往前走多遠,關於這個值我們會在下文中詳細講解。你可以暫時人為它是一個類似0.01或0.001的固定值。
在具體的項目,我們不會讓演算法無休止的運行下去,所以通常會設置一個迭代次數的最大上限。
線性回歸的梯度下降
有了上面的知識,我們可以回到線性模型代價函數的梯度下降演算法實現了。
首先,根據代價函數我們可以得到梯度向量如下:
[ abla f({ heta}) = (frac{partial L( heta)}{ partial heta_{0}}, frac{ partial L( heta)}{ partial heta_{1}}) = (frac {2}{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) , frac {2}{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) x^{i})]
接著,將每個偏導數帶入迭代的公式中,得到:
[ heta_{0} := heta_{0} - lambda frac{partial L( heta_{0})}{ partial heta_{0}} = heta_{0} - frac {2 lambda }{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) heta_{1} := heta_{1} - lambda frac{partial L( heta_{1})}{ partial heta_{1}} = heta_{1} - frac {2 lambda }{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) x^{i}]
由此就可以通過代碼實現我們的梯度下降演算法了,演算法邏輯並不復雜:
learning_rate = 0.01
def gradient_descent(x, y):
t0 = 10
t1 = 10
delta = 0.001
for times in range(1000):
sum1 = 0
sum2 = 0
for i in range(len(x)):
sum1 += (t0 + t1 * x[i] - y[i])
sum2 += (t0 + t1 * x[i] - y[i]) * x[i]
t0_ = t0 - 2 * learning_rate * sum1 / len(x)
t1_ = t1 - 2 * learning_rate * sum2 / len(x)
print('Times: {}, gradient: [{}, {}]'.format(times, t0_, t1_))
if (abs(t0 - t0_) < delta and abs(t1 - t1_) < delta):
print('Gradient descent finish')
return t0_, t1_
t0 = t0_
t1 = t1_
print('Gradient descent too many times')
return t0, t1
這段代碼說明如下:
我們隨機選擇了 都為10作為起點
設置最多迭代1000次
收斂的范圍設為0.001
學習步長設為0.01
如果我們將演算法迭代過程中求得的線性模式繪制出來,可以得到下面這幅動態圖:
最後演算法得到的結果如下:
Times: 657, gradient: [5.196562662718697, 1.952931052920264]
Times: 658, gradient: [5.195558390180733, 1.9530753071808193]
Times: 659, gradient: [5.194558335124868, 1.9532189556399233]
Times: 660, gradient: [5.193562479839619, 1.9533620008416623]
Gradient descent finish
從輸出中可以看出,演算法迭代了660次就收斂了。這時的結果[5.193562479839619, 1.9533620008416623],這已經比較接近目標值 [5, 2]了。如果需要更高的精度,可以將delta的值調的更小,當然,此時會需要更多的迭代次數。
高維擴展
雖然我們舉的例子是二維的,但是對於更高維的情況也是類似的。同樣是根據迭代的公式進行運算即可:
[ heta_{i} = heta_{i} - lambda frac {partial L( heta)}{partial heta_i} = heta_{i} - frac{2lambda}{m} sum_{i=1}^{m}(h_ heta(x^{k})-y^k)x_i^k]
這里的下標i表示第i個參數,上標k表示第k個數據。
梯度下降家族BGD
在上面的內容中我們看到,演算法的每一次迭代都需要把所有樣本進行遍歷處理。這種做法稱為之Batch Gradient Descent,簡稱BGD。作為演示示例只有10條數據,這是沒有問題的。
但在實際的項目中,數據集的數量可能是幾百萬幾千萬條,這時候每一步迭代的計算量就會非常的大了。
於是就有了下面兩個變種。
SGD
Stochastic Gradient Descent,簡稱SGD,這種演算法是每次從樣本集中僅僅選擇一個樣本來進行計算。很顯然,這樣做演算法在每一步的計算量一下就少了很多。
其演算法公式如下:
[ heta_{i} = heta_{i} - lambda frac {partial L( heta)}{partial heta_i} = heta_{i} - lambda(h_ heta(x^k)-y^k)x_i^k]
當然,減少演算法計算量也是有代價的,那就是:演算法結果會強依賴於隨機取到的數據情況,這可能會導致演算法的最終結果不太令人滿意。
MBGD
以上兩種做法其實是兩個極端,一個是每次用到了所有數據,另一個是每次只用一個數據。
我們自然就會想到兩者取其中的方法:每次選擇一小部分數據進行迭代。這樣既避免了數據集過大導致每次迭代計算量過大的問題,也避免了單個數據對演算法的影響。
這種演算法稱之為Mini-batch Gradient Descent,簡稱MBGD。
其演算法公式如下:
[ heta_{i} = heta_{i} - lambda frac {partial L( heta)}{partial heta_i} = heta_{i} - frac{2lambda}{m} sum_{i=a}^{a + b}(h_ heta(x^k)-y^k)x_i^k]
當然,我們可以認為SGD是Mini-batch為1的特例。
針對上面提到的演算法變種,該如何選擇呢?
下面是Andrew Ng給出的建議:
如果樣本數量較小(例如小於等於2000),選擇BGD即可。
如果樣本數量很大,選擇 來進行MBGD,例如:64,128,256,512。
下表是 Optimization for Deep Learning 中對三種演算法的對比
方法准確性更新速度內存佔用在線學習BGD好慢高否SGD好(with annealing)快低是MBGD好中等中等是
演算法優化
式7是演算法的基本形式,在這個基礎上有很多人進行了更多的研究。接下來我們介紹幾種梯度下降演算法的優化方法。
Momentum
Momentum是動量的意思。這個演算法的思想就是藉助了動力學的模型:每次演算法的迭代會使用到上一次的速度作為依據。
演算法的公式如下:
[v^t = gamma v^{t - 1} + lambda abla f( heta) heta = heta - v_t]
對比式7可以看出,這個演算法的主要區別就是引入了,並且,每個時刻的受前一個時刻的影響。
從形式上看,動量演算法引入了變數 v 充當速度角色——它代表參數在參數空間移動的方向和速率。速度被設為負梯度的指數衰減平均。名稱動量來自物理類比,根據牛頓運動定律,負梯度是移動參數空間中粒子的力。動量在物理學上定義為質量乘以速度。在動量學習演算法中,我們假設是單位質量,因此速度向量 v 也可以看作是粒子的動量。
對於可以取值0,而是一個常量,設為0.9是一個比較好的選擇。
下圖是momentum演算法的效果對比:
對原來的演算法稍加修改就可以增加動量效果:
def gradient_descent_with_momentum(x, y):
t0 = 10
t1 = 10
delta = 0.001
v0 = 0
v1 = 0
gamma = 0.9
for times in range(1000):
sum1 = 0
sum2 = 0
for i in range(len(x)):
sum1 += (t0 + t1 * x[i] - y[i])
sum2 += (t0 + t1 * x[i] - y[i]) * x[i]
v0 = gamma * v0 + 2 * learning_rate * sum1 / len(x)
v1 = gamma * v1 + 2 * learning_rate * sum2 / len(x)
t0_ = t0 - v0
t1_ = t1 - v1
print('Times: {}, gradient: [{}, {}]'.format(times, t0_, t1_))
if (abs(t0 - t0_) < delta and abs(t1 - t1_) < delta):
print('Gradient descent finish')
return t0_, t1_
t0 = t0_
t1 = t1_
print('Gradient descent too many times')
return t0, t1
以下是該演算法的輸出:
Times: 125, gradient: [4.955453758569991, 2.000005017897775]
Times: 126, gradient: [4.955309381126545, 1.9956928964532015]
Times: 127, gradient: [4.9542964317327005, 1.9855674828684156]
Times: 128, gradient: [4.9536358220657, 1.9781180992510465]
Times: 129, gradient: [4.95412496254411, 1.9788858350530971]
Gradient descent finish
從結果可以看出,改進的演算法只用了129次迭代就收斂了。速度比原來660次快了很多。
同樣的,我們可以把演算法計算的過程做成動態圖:
對比原始的演算法過程可以看出,改進演算法最大的區別是:在尋找目標值時會在最終結果上下跳動,但是越往後跳動的幅度越小,這也就是動量所產生的效果。
Learning Rate 優化
至此,你可能還是好奇該如何設定學習率的值。
事實上,這個值的選取需要一定的經驗或者反復嘗試才能確定。
關鍵在於,這個值的選取不能過大也不能過小。
如果這個值過小,會導致每一次迭代的步長很小,其結果就是演算法需要迭代非常多的次數。
那麼,如果這個值過大會怎麼樣呢?其結果就是:演算法可能在結果的周圍來回震盪,卻落不到目標的點上。下面這幅圖描述了這個現象:
事實上,學習率的取值未必一定要是一個常數,關於這個值的設定有很多的研究。
下面是比較常見的一些改進演算法。
AdaGrad
AdaGrad是Adaptive Gradient的簡寫,該演算法會為每個參數設定不同的學習率。它使用歷史梯度的平方和作為基礎來進行計算。
其演算法公式如下:
[ heta_i = heta_i - frac{lambda}{sqrt{G_t + epsilon}} abla f( heta)]
對比式7,這里的改動就在於分號下面的根號。
根號中有兩個符號,第二個符號比較好理解,它就是為了避免除0而人為引入的一個很小的常數,例如可以設為:0.001。
第一個符號的表達式展開如下:
[G_t = sum_{i = 1}^{t} abla f( heta){i} abla f( heta){i}^{T}]
這個值其實是歷史中每次梯度的平方的累加和。
AdaGrad演算法能夠在訓練中自動的對learning rate進行調整,對於出現頻率較低參數採用較大的學習率;相反,對於出現頻率較高的參數採用較小的學習率。因此,Adagrad非常適合處理稀疏數據。
但該演算法的缺點是它可能導致學習率非常小以至於演算法收斂非常的慢。
關於這個演算法的直觀解釋可以看李宏毅教授的視頻課程:ML Lecture 3-1: Gradient Descent。
RMSProp
RMS是Root Mean Square的簡寫。RMSProp是AI教父Geoff Hinton提出的一種自適應學習率方法。AdaGrad會累加之前所有的梯度平方,而RMSProp僅僅是計算對應的平均值,因此可緩解Adagrad演算法學習率下降較快的問題。
該演算法的公式如下:
[E[ abla f( heta_{i})^2]^{t} = gamma E[ abla f( heta_{i})^2]^{t - 1} + (1-gamma)( abla f( heta_{i})^{t})^{2} heta_i = heta_i - frac{lambda}{sqrt{E[g^2]^{t+1} + epsilon}} abla f( heta_{i})]
類似的,是為了避免除0而引入。 是衰退參數,通常設為0.9。
這里的 是t時刻梯度平方的平均值。
Adam
Adam是Adaptive Moment Estimation的簡寫。它利用梯度的一階矩估計和二階矩估計動態調整每個參數的學習率。
Adam的優點主要在於經過偏置校正後,每一次迭代學習率都有個確定范圍,使得參數比較平穩。
該演算法公式如下:
[m^{t} = eta_{1} m^{t-1} + (1-eta_{1}) abla f( heta) v^{t} = eta_{2} v^{t-1} + (1-eta_{2}) abla f( heta)^2 widehat{m}^{t} = frac{m^{t}}{1 - eta^{t}_1} widehat{v}^{t} = frac{v^{t}}{1 - eta^{t}_2} heta = heta - frac{lambda}{sqrt{widehat{v}^{t}} + epsilon}widehat{m}^{t}]
,分別是對梯度的一階矩估計和二階矩估計。, 是對,的校正,這樣可以近似為對期望的無偏估計。
Adam演算法的提出者建議 默認值為0.9,默認值為0.999,默認值為 。
在實際應用中 ,Adam較為常用,它可以比較快地得到一個預估結果。
優化小結
這里我們列舉了幾種優化演算法。它們很難說哪種最好,不同的演算法適合於不同的場景。在實際的工程中,可能需要逐個嘗試一下才能確定選擇哪一個,這個過程也是目前現階段AI項目要經歷的工序之一。
實際上,該方面的研究遠不止於此,如果有興趣,可以繼續閱讀 《Sebastian Ruder: An overview of gradient descent optimization algorithms》 這篇論文或者 Optimization for Deep Learning 這個Slides進行更多的研究。
由於篇幅所限,這里不再繼續展開了。
演算法限制
梯度下降演算法存在一定的限制。首先,它要求函數必須是可微分的,對於不可微的函數,無法使用這種方法。
除此之外,在某些情況下,使用梯度下降演算法在接近極值點的時候可能收斂速度很慢,或者產生Z字形的震盪。這一點需要通過調整學習率來迴避。
另外,梯度下降還會遇到下面兩類問題。
局部最小值
局部最小值(Local Minima)指的是,我們找到的最小值僅僅是一個區域內的最小值,而並非全局的。由於演算法的起點是隨意取的,以下面這個圖形為例,我們很容易落到局部最小值的點裡面。
這就是好像你從上頂往下走,你第一次走到的平台未必是山腳,它有可能只是半山腰的一個平台的而已。
演算法的起點決定了演算法收斂的速度以及是否會落到局部最小值上。
壞消息是,目前似乎沒有特別好的方法來確定選取那個點作為起點是比較好的,這就有一點看運氣的成分了。多次嘗試不同的隨機點或許是一個比較好的方法,這也就是為什麼做演算法的優化這項工作是特別消耗時間的了。
但好消息是:
對於凸函數或者凹函數來說,不存在局部極值的問題。其局部極值一定是全局極值。
最近的一些研究表明,某些局部極值並沒有想像中的那麼糟糕,它們已經非常的接近全局極值所帶來的結果了。
鞍點
除了Local Minima,在梯度下降的過程中,還有可能遇到另外一種情況,即:鞍點(Saddle Point)。鞍點指的是我們找到點某個點確實是梯度為0,但它卻不是函數的極值,它的周圍既有比它小的值,也有比它大的值。這就好像馬鞍一樣。
如下圖所示:
多類隨機函數表現出以下性質:在低維空間中,局部極值很普遍。但在高維空間中,局部極值比較少見,而鞍點則很常見。
不過對於鞍點,可以通過數學方法Hessian矩陣來確定。關於這點,這里就不再展開了,有興趣的讀者可以以這里提供的幾個鏈接繼續探索。
參考資料與推薦讀物
Wikipeida: Gradient descent
Sebastian Ruder: An overview of gradient descent optimization algorithms
吳恩達:機器學習
吳恩達:深度學習
Peter Flach:機器學習
李宏毅 - ML Lecture 3-1: Gradient Descent
PDF: 李宏毅 - Gradient Descent
Intro to optimization in deep learning: Gradient Descent
Intro to optimization in deep learning: Momentum, RMSProp and Adam
Stochastic Gradient Descent – Mini-batch and more
劉建平Pinard - 梯度下降(Gradient Descent)小結
多元函數的偏導數、方向導數、梯度以及微分之間的關系思考
[Machine Learning] 梯度下降法的三種形式BGD、SGD以及MBGD
❺ e的x減一次方的導數
e的x減一次方的導數是e^(x-1)。
具體解法如下:
e的x減一次方,即為e^(x-1)
e的x減一次方的導數,即為e^(x-1)的導數
e^(x-1)'=e^(x-1)*(1)=e^(x-1)
所以e的x減一次方的導數是e^(x-1)。
(5)組合最優化與演算法pdf擴展閱讀
導數的求解注意點:
1、理解並牢記導數定義。導數定義中一定要出現這一點的函數值,如果已知告訴等於零,那極限表達式中就可以不出現,否就不能推出在這一點可導。
2、導數定義相關計算。這里有幾種題型:1)已知某點處導數存在,計算極限,這需要掌握導數的廣義化形式,還要注意是在這一點處導數存在的前提下,否則是不一定成立的。
3、導數、可微與連續的關系。函數在一點處可導與可微是等價的,可以推出在這一點處是連續的,反過來則是不成立的。
4、導數的計算。導數的計算可以說在每一年的考研數學中都會涉及到,而且形式不一,考查的方法也不同。
5、高階導數計算。需要同學們記住幾個常見的高階導數公式,將其他函數都轉化成我們這幾種常見的函數,代入公式就可以了,也有通過求一階導數,二階,三階的方法來找出他們之間關系的。