ใช้ neural network ทำ linear regression ง่ายๆใน ภาษา Wolfram

พอดีเมื่อวานมีพูดแนะนำเทคนิค neural network ในที่ทำงาน แล้วมีคนถามว่าใช้ทำ linear regression ได้ไหม ผมก็บอกว่าได้เลยทำให้ดูเป็นตัวอย่าง code ที่แชร์นี้ก็เป็นตัวอย่างที่ผมทำเมื่อวานครับ ซึ่งก็เริ่มด้วยการ generate ข้อมูลที่ดูเหมือนเป็นเส้นตรงมา จากนั้นก็สร้าง neural network โดยใช้ linear layer ที่มี input กับ output ค่าเดียว โดย loss function ที่ใช้คือ mean square จากกนั้นก็ใช้คำสั่ง NetTrain ในการหา weight กับ bias ของ linear layer จากนั้นก็ลอง plot เปรียบเทียบผลที่ได้กับคำสั่ง LinearModelFit

คำสั่ง NetTrain มันก็เหมือนกับ NMinimize กับ FindMinimum ที่จะหาจุดต่ำสุดของ Function ที่เราสนใจซึ่งในกรณีนี้ก็คือ mean square

เรียก compiled function จาก compiled function

โดยปกติ Mathematica หรือภาษา Wolfram จะมีปัญหากับการเรียก function ที่สร้างจาก Compile ใน function ที่จะสร้างจาก Compile อีกทีได้ (ส่วนใหญ่เป็นเรื่องที่เกี่ยวกับว่า Funcions ไหนที่มัน compile ได้หรือไม่ได้) แต่ใน version 12 นี้เราสามารถที่จะทำแบบนั้นได้ ถ้า function เหล่านั้นถูก compile ด้วยคำสั่ง FunctionCompile ซึ่งผมมองว่ามันสะดวกอย่างมาก และที่สำคัญเราสามารถที่จะ export สร้างเป็น library ไฟล์ได้ด้วย โดยคำสั่ง FunctionCompileExport สกุลไฟล์ที่สร้างได้ก็ได้แก่

ตัวอย่างการเรียกใช้ compiled function ใน compiled function อีกที ก็สมมุติให้ผมมี function สำหรับทำ bisection เพื่อหาค่าที่ทำให้ function ที่สนใจเป็น 0 หรือใกล้ 0 มากๆ

BisectionMethod = FunctionCompile[
    Function[
        {Typed[f, {"Real64"} -> "Real64"], Typed[lim0, "Real64"], Typed[lim1, "Real64"]},
      Module[{Maxiter = 100, tol = 10.^-8, iter = 0, x0 = lim0, x1 = lim1, mid = 0.0, f0, f1, fmid},
      f0 = f[x0]; 
      f1 = f[x1];
            While[Abs[x1 - x0] >= tol && iter++ < Maxiter,
                mid = (x1 + x0)/2.;
                fmid = f[mid];
                If[Xor[fmid > 0, f0 > 0],
                    x1 = mid; f1 = fmid,
                    x0 = mid; f0 = fmid]];
               mid]]]

โดยfunction ที่ผมจะหา root คือ f(x) = sin(x)+exp(x)

f = FunctionCompile[Function[Typed[arg, "Real64"], Sin[arg] + Exp[arg]]]

จะเห็นได้ว่าทั้ง BisectionMethod และ f ถูกสร้างจาก FunctionCompile แต่ f จะถูกเรียกเข้าไปใช้ใน BisectionMethod อีกที

BisectionMethod[f, -1.0, 1.0]-FindRoot[Sin[x] + Exp[x], {x, -1}][[1, 2]]
(* -5.18667*10^-11 *)

เรื่องการเรียกใช้ package ใน package อีกทีของภาษา Wolfram

พอดีกำลังรับงานพัฒนาโมเดลตัวหนึ่งด้วยภาษา Wolfram แล้วเจอปัญหาเรื่องการเรียกใช้ Package ในอีก Package หนึ่ง code ที่เขาส่งมาให้ช่วยดูให้มันมีการเรียกใช้ package ตั้งแต่คำสั่ง BeginPackage เช่น

BeginPackage[ "Package`", {"Package1`", "Package2`"}]
  ...

แต่ปรากฏว่าหลังจากที่ทำการ deploy ไปแล้ว เจอว่ามันมีการคำนวณอะไรบางอย่างผิด ทั้งที่ในตัว unit test ก็ไม่เจอ ผมก็นั่งไล่ดูทีล่ะบรรทัดจนพบว่ามันมีการเขียนทับ functions กัน เพราะชื่อดันเหมือนกัน

ผมก็เลยเปลี่ยนวิธีการเรียก packages ด้วย Needs ไปใช้วิธีเรียกทีล่ะตัวหลังคำสั่ง BeginPackage แทน เช่น

BeginPackage[ "Package`"]
  Needs[ "Package1`"]
  Needs[ "Package2`"]
  ...

ด้วยวิธีนี้ตัว คำสั่งจาก package1 หรือ package2 จะถูกเรียกใช้ได้ภายใน package แต่ด้านนอก package จะเรียกไม่ได้ พูดง่ายๆคือไม่มีผลอะไรกับตัวแปรนอก package

Wolfram animation in Jupyter

หลังๆมานี้ตั้งแต่ Wolfram Engine มันใช้ได้ฟรี ผมก็มักจะแนะนำให้คนโน่นคนนี้ใช้มันอยู่เรื่อยๆ หลายคนที่ก็ชอบ ส่วนอีกหลายคนก็ยังรู้สึกอึดอัดเพราะมันยังไม่ชินหรือไม่ก็เพราะ UI มันไม่มีไม่น่าใช้ ยิ่งแนะนำให้ใช้กับ Jupyter ยิ่งหนักเลยเพราะยังทำ Animation ไม่ได้หรือพวก 3D ทั้งหลายก็หมุนไม่ได้ zoom ก็ไม่ได้ ยิ่งคำสั่งพวก Manipulate ที่ถือได้ว่าเป็นสิ่งหลักที่ถูกใช้ในหลายๆงานก็ใช้ไม่ได้เลย

ส่วนตัวผมก็ยังถือว่ามันไม่ได้แย่ขนาดนั้น เพราะทางWolframเองก็คงเข้าใจว่าถ้าเอาWolfram engine ไปใช้โดยไม่มีUI ที่เหมือน Mathematica notebook คนคงมาใช้งานมันน้อยแน่ๆ เขาเลยเอา WolframPlayer ติดมาด้วยกับ Wolfram engine ซึ่งนั่นหมายความว่าผู้ใช้ก็ต้อง Export สิ่งที่ต้องการอย่าง 3D, Animation อื่น ๆมาอยู่ในรูปแบบ notebook (.nb) หรือ .cdf แล้วเปิดในตัว player แทน

ซึ่งถ้าใช้ตัว Jupyter กับ Wolfram ก็สามารถที่จใช้คำสั่ง RunProcess เรียกตัว Player มาเปิดไฟล์ที่ Exportได้ อย่างเช่น

outfile=FileNameJoin[{Directory[],outputfilename}];

RunProcess[{"C:\Program Files\Wolfram Research\Wolfram Engine\12.0\SystemFiles\FrontEnd\Binaries\Windows-x86-64\WolframPlayer.exe",outfile}]

อ่านตัวเลขจากภาพ

มีคนถามคำถามนี้ใน Facebook ของสมาคมโปรแกรมเมอร์ไทย

คำถามนี้สามารถทำได้ง่ายๆด้วยภาษา Wolfram ครับ โดยใช้คำสั่ง TextRecognize ตามนี้ครับ

https://www.wolframcloud.com/obj/sompob/Published/demo_3Oct19.nb