跳到主要內容區

非線性規劃入門演算法與實作 - 歷史系雙主修會計系 林言芯

課程名稱非線性規劃入門演算法與實作      授課教師工資管系 林仁彥老師
心得分享者歷史系雙主修會計系 林言芯

課程總結
機器學習與數據分析在現今已成為了顯學,但如何實際讓機器透過深度學習從海量的數據中找出一定的規則,便需要使用數學上的技巧搭配程式語言構造出的模型來達成目標。
「非線性規劃入門演算法與實作」是一堂理論結合實作的跨領域模組化課程,主要是帶領學員認識非線性規劃的理論與其在演算法上的應用,並且結合較容易操作的 Python 程式語言執行演算法。為期五天的課程中,工資管系的林仁彥老師介紹了非常多非線性規劃的基本演算法,包括梯度下降法(Gradient Descent method)、共軛梯度法(Conjugate Gradient Method)、內點法(Interior Point Method)、支持向量機(Support Vector Machine)等演算法。同學在獲得資料之後,必須學會如何根據資料的型態、分布趨勢、方向等等決定適合的模型,並善用這些模型找到最佳解。貫穿這堂課的核心則是使用內點法求解,跟線性迭代的方法不同,它是從一個可行區域的內部逐漸收斂找出最佳解的演算法。
課程最後一天的專案執行必須透過支援向量機完成非線性的分類。支援向量機是一個非常強大的工具,能夠準確分類並預測不同類型的資料。首先要找出不同種類資料點之間最大距離的線,也就是Margin 最大的線。其中硬性支援向量機(Hard-margin support vector machine)不允許資料落在間距內,必須完美地分離所有資料。不過有時無法完美分離所有資料,因此會使用軟性支援向量機(Soft-margin support vector machine)允許部分資料落在間距範圍內。當天的課程對我來說是非常有挑戰的一天,因為必須在聽懂老師講解的理論之後馬上開始實作撰寫程式。對一個數學基礎僅有微積分,又在上上個星期才剛修過基礎Python的人來說實在有些吃力。一剛開始在構思如何透過程式找到目標式的時候卡關了很久,甚至和旁邊的同學討論完自己的想法時,看到他已經從我的想法中找到了靈感,我卻還是在原地打轉,直到聽了助教跟老師的講解之後才慢慢能夠瞭解每行程式的邏輯與意義。
起初我認為直接以十個資料點來撰寫程式,可能會因為資料量偏多而影響思考的流暢度,因此最後決定以兩個點進行分類。產生資料點之後便依照KKT條件與內點法的過程,求出目標式yi (W^t )xi+b=0及限制式後,將點帶入程式轉化出係數的矩陣A、 b 與 c。本專題的硬性支援向量機之最佳化分類線,剛好通過原點將兩個資料點完全分離。接著要進行軟性支援向量機,其中為了找出最大容忍度的正則化C,讓兩線能夠剛好壓在線上,形成最大的 Margin,真的花了很多時間研究。雖然我最後畫出來的線有些怪怪的,但也謝謝助教在過程中用心提點我程式中的瑕疵以及需要改善的地方。
課程風格
本課程由來自工業與資訊管理學系的林仁彥教授開設,如果有修習過林仁彥老師課程的同學應該都曉得老師非常重視同學的學習過程,因此在每堂課的前一到兩個小時講解當天需要用到的所有數理概念時,老師都很願意針對基礎觀念或是容易混淆的概念多加解釋,確保每一位同學都有聽懂理解。老師強調很多非線性規劃與深度學習的理論,其實都是建立在高中數學或是微積分的課程之上,打破同學們對於數學與公式很困難的刻板印象。所以無論是否為理工背景或是沒修習過線性規劃的同學,在經過老師的指引以及跟隨課程的進度後,應該都能夠快速吸收並了解非線性規劃的重點。
理論講授結束後,為了加深同學的印象,老師會透過上機實作的方式,讓我們了解到非線性規劃的概念如何實際運用到程式設計。同學需要練習如何在理解數學理論後,將其轉化為程式碼並試著分析數據,例如如何將內點法公式化為程式並且找出最佳解。我認為這樣的教學方式比起學期課程的純講義模式,雖然難度提高了許多,但也快速提升了學習成效。透過實作的方式,不僅能快速檢驗自己的學習成果,也能及時發現學習上的盲點與不足。在現今資訊爆炸,科技快速進步的時代,成大跨領域模組化的學習方式如同一杯濃縮咖啡,量不多但是能夠立即發揮效果。
學習心得
過去曾在系上修過監督式學習的相關課程,老師教了很多理論跟數學模型,然而實作的機會並不多,也不曉得如何實際應用與操作,只能靠網路自學相關課程。
這堂課不僅補足了學期課程實作與應用的不足,還巧妙地以簡單扼要的方式將理論傳達給同學,並講究實際運用與操作,把將近半個學期的艱深內容濃縮在短短五天的課程中,讓我們能快速學習如何應用跟實戰,相信林仁彥老師在課程設計與安排上花費不少心思。我曾經以為這是一個門檻非常高,永遠跨不過去的學問,如今透過模組化課程設計,即使是非理工背景,也能獲得跨入機器學習的領域一探究竟的鑰匙。
雖然對於很久沒碰數學的我來說,剛開始確實很有難度,深感先學修習線性規劃的模組課程,在銜接非線性規劃時會比較容易一些。由於自己先前僅修過微積分以及線性代數,為了在這五天中趕上大家的腳步,犧牲了許多睡眠時間,每一張簡報每一個數學公式與模型、作業內容都必須再利用我下課尋找老師與助教問到教室關閉、利用通勤或是吃飯的時間思考、甚至是好幾個深夜向 Chat GTP、Google 或是在台北就讀資工系的妹妹討教才弄懂,並盡力寫出程式或是 debug 完成。但當我發現我能激勵自己在短時間內用剛學會的 Python 寫出最佳化模型時,那種成就感對一位文組生來說,是過去完全無法想像的,真的學到了很多。我認為模組化課程是個非常好的機會,讓自己在短時間的壓力下快速學會一件事,或是學習用各種不同的方式去解決過去沒有遇過的問題。
關鍵字 #成大模組化 #非線性規劃 #內點法 #SVM #機器學習

瀏覽數: