Recurrent Neural Networks (part1)

Pisit Bee
Boobee
Published in
4 min readAug 7, 2019

วันนี้มาพูดเรื่อง RNN บ้างครับ RNN เป็น Neural Networks ประเภท ที่ทำงานกับ ข้อมูลที่เป็น sequence หมายถึงข้อมูลที่มาเป็น ลำดับ เป็นหลัก ถามว่าทำไม Neural Networks แบบ ธรรมดา พวก MLP ถึงไม่ Work ลองพิจารณารูปด่านล่างนะครับ

หากเป็น MLP ธรรมดา เราจำเป็นต้องมี X vector และ Y output vector ที่มีขนาดคงที่ ยกตัวอย่างเช่น X input vector ที่เป้นรูปภาพ มีขนาด 32*32 มันคงที่ตลอดทุกรูปภาพ (ถึงแม้มันจะใหญ่ เราก็จะย่อ ให้มันเหลือ 32*32) แต่ถ้าข้อมูลที่เป็นพวก ข้อความ 1 ประโยค มันไม่ได้มี แค่ 5 คำ 10 คำตลอดครับ มันปรับเปลี่ยนได้ตลอด ดังนั้น MLP ธรรมดา จึงไม่ Work Androw Ng กล่าวว่า “There are two main problems the first is that the inputs and outputs can be different lengths and different examples. The second, It does’t shared features learned across different prositions of text” ส่วนอันที่ 2 Andrew NG กล่าวว่า มันไม่สามารถ แชร์ ข้อมูลหรือแชร์ Feature ระหว่างกันได้ หมายถึง คำที่ 1 กับ คำที่ 2 ไม่มีข้อมูลหรือ weight ที่ส่งผลถึงกัน

Recurrent Neural Networks.

พามาดู Model ของ RNN กันก่อนครับ หน้าตามันจริงๆ แล้วมีแค่ 1 layer เท่านั้น ถ้าเทียบจาก Gereral Neural Net ทั่วๆ ไป ลองตัด loop ทิ้งก่อนนะครับ ดูแค่มัน มี x เป็น input มี A เป็น Hidden layer และ ht เป้น output ออกไป แต่พิเศษคือ ก่อนที่มันจะเป้น output ออกไป มันจะเป็น input สำหรับ ข้อมูลในชุดถัดไปด้วยครับ กล่าวคือ มี output 2 ทาง ทางที่ 1 เป็น output จริงๆ และ อีกทางจะวนกลับมา ต่อกับ input ที่จะเข้ามาในครั้งถัดไปครับ

source: https://colah.github.io/posts/2015-08-Understanding-LSTMs/

จากภาพ RNN ในภาพมีแค่ 1 Hidden layer เท่านั้นนะครับ เดี๋ยวจะงง คำถามคือ ทำหลายๆ Hidden layer ได้ไหม ตอบคือ ได้ครับ แต่เดี๋ยวเอาไว้ part หน้านะครับ

Rnn Equation

จากการที่ RNN จริงๆ แล้วเป็นแค่ MLP นี่เหละครับ แต่เพิ่มความสามารถเรื่องของ Sequence เข้าไป

source : http://imatge-upc.github.io/telecombcn-2016-dlcv/

สังเกตุว่า ใน ชั้น Hidden นั้นจะมี input ของ ค่า Hidden ในครั้งก่อนหน้ามาร่วมด้วย จะสังเกตุว่า เรามี Matrix Paramerter อยู่ 3 ตัวที่ต้องทำการปรับจูน นั่นคือ V,W และ U ครับ โดยแต่ละ Time Step จะให้ค่า output y และ h ออกมา ซึ่ง h ที่ออกมาจะไปเป็น Input Vector ร่วมกับ x ใน Time Step ถัดไป โดยที่ Activation Function ของ f และ g เป็น คือ softmax และ tanh ตามลำดับ

มาดูส่วนของโค้ดกันบ้างนะครับ

จากโค้ดทำการสร้าง RNN Cell ขึ้นมา 1 cell นะครับ ให้มีการรับ Input แค่ 1 ตัวและมี hidden node แค่ 1 ตัวเท่านั้น ไม่มี Bias เพื่อง่ายตอนการคำนวณนะครับ

ทดลองทำการปริ้น parameter ที่อยู่ใน RNN ออกมานะครับ จะสังเกตุเห็นว่า มีด้วยกัน 2 parameter นั่นคือ U และ W เพื่อให้ง่ายในที่นี้ จะใช้เพียง 1 ตัว แต่ต้องพึงระลึกเสมอว่า U และ W เป็น Matrix นะครับ เดี๋ยวจะอธิบายในลำดับถัดไป

ถัดมาทำการสร้าง Input sequence ขึ้นมา ในที่นี้ มี 3 time step นั้นคือ ให้ครั้งแรกinput มีค่า เป็น 1 ครั้งที่ Input มีค่าเป็น -0.7775 และครั้งสุดท้าย Input มีค่าเป็น 0.2588 และ ค่า Hidden เริ่มต้นมีค่าเป็น 0

ถ้าเราทำการ Map ค่าตัวเลข กับ Model RNN จะเป็นลักษณะภาพด้านบนครับ จริงๆ แล้วจะมีส่วนของ Y output ด้วย แต่ในที่นี้ขอละไว้ก่อน อยากให้เข้าใจถึงเรื่องของ ลำดับการทำงานของ RNN ก่อน

จากภาพ จะสังเกตุเห็นว่า h_0 จะมีค่าเป็น 0 (เรา Setเอง) และ X_1 จะมีค่าเป็น 1 ให้ทำการคำนวณตามสมการครับ

เรามี X_t มีค่าเป็น 1 ซึ่งคูณกับ W มีค่าเป็น 0.3116 ได้ค่าเป็น 0.3116 ในส่วนพจน์อื่นๆ มีค่าเป็น 0 เพราะ h_t-1 มีค่าเป็น 0 (เราเซ็ตเอง) ส่วน b_h ไม่มี ดังนั้นมีค่า เป็น 0 เช่นกัน เราจะได้ค่า h_t = g(0.3116) ซึ่ง Function g คือ Function tanh ทำให้ค่า h_t มีค่าเป้น 0.

ผลจากการรัน จะเห็นว่า h1 จาก library ของ pytorch ให้ค่า 0.3019 เราทำการคำนวณมือโดยให้ 0.3116 ผ่าน Function tanh เข้าไปซึ่งได้ผลตรงกัน เย้้้

ถัดมาเราจะพิสูจน์ว่า ค่า W และ U ในแต่ละ Time Step ใช้ค่าเดียวกันหรือไม่ เราจะต้องเอา h_t ที่เราคำนวฯได้ใหม่ ซึ่งก็คือ 0.3019 คูณกับ U และ X_t ใหม่ คือ -0.7775 คูณกับ W

ตามการคำนวณนี้นะครับ ซึ่งผลก็คือ

ตรงกันครับ เย้้้้

โค้ดทั้งหมดครับ

สรุป

  1. RNN เป็น Neural Network ประเภท หนึ่งที่ทำงานในรูปของ Time Sequence นะครับ โดยใช้ Weight เดียวกันในแต่ละ Time Step เน้นว่าใช้ Weight เดียวกัน
  2. โดยทั่วไปแล้วเราจะกำหนด hidden_value เริ่มต้นจะให้มีค่าเป็น 0

--

--