เรามาถึง Activation Function ep.3 เรื่อง ReLU Function ซึ่งเป็นฟังก์ชันที่นิยมใช้ในการเทรน Deep Learning มากที่สุดในปัจจุบัน เมื่อเราดูโครงสร้างภายในโมเดล Deep Neural Network ชื่อดังสมัยใหม่ ก็จะเห็นแต่ ReLU เต็มไปหมด แล้ว ReLU มีดีตรงไหน ต่างกับ Sigmoid และ Tanh อย่างไร เราจะมาเรียนรู้กัน

ReLU Function

ReLU ย่อมาจาก Rectified Linear Unit คือ ฟังก์ชันเส้นตรงที่ถูกปรับแก้ Rectified ไม่ได้เป็นรูปตัว S เหมือน 2 ฟังก์ชันก่อนหน้า ReLU เป็นฟังก์ชันที่เรียบง่ายกว่าทุก Activation Function ที่ผ่านมา แต่ทรงพลัง เนื่องจาก ถ้า Input เป็นบวก Slope จะเท่ากับ 1 ตลอดกาล ทำให้ Gradient ไม่หาย (ไม่เกิด Vanishing Gradient) ส่งผลให้เราเทรนโมเดลได้เร็วขึ้นมาก

Sigmoid and ReLU Activation Function. Credit https://towardsdatascience.com/activation-functions-neural-networks-1cbd9f8d91d6
Sigmoid and ReLU Activation Function. Credit https://towardsdatascience.com/activation-functions-neural-networks-1cbd9f8d91d6

สมการของ ReLU Function

\(f(x) = \max(0, x) = \begin{cases}
0 & \text{for } x \le 0\\
x & \text{for } x > 0\end{cases}\)

Derivative ของ ReLU Function

ถ้า x เป็นบวก Derivative ของ ReLU Function = 1 กุญแจสำคัญที่ช่วยให้การเทรน Deep Neural Network ทำได้รวดเร็วมากขึ้น

\(f'(x) = \begin{cases}
0 & \text{for } x \le 0\\
1 & \text{for } x > 0\end{cases}\)

แต่ตอนนี้เรายังไม่ต้องสนใจ สมการสูตรคณิตศาสตร์ เรามาดูกันว่า ReLU Function จริง ๆ แล้ว Input/Output ของมันมีหน้าตาเป็นอย่างไร เปรียบเทียบกับ Sigmoid Function

เรามาเริ่มกันเลย

Open In Colab
In [1]:
%reload_ext autoreload
%autoreload 2
%matplotlib inline
In [2]:
import torch
import matplotlib.pyplot as plt

สร้าง x เป็นเลข ระหว่าง -10 บวกทีละ 0.01 ไปจนถึง 10 เราจะเอามาเป็นแกน x

In [3]:
x = torch.arange(-10., 10., 0.01)
In [4]:
x
Out[4]:
tensor([-10.0000,  -9.9900,  -9.9800,  ...,   9.9700,   9.9800,   9.9900])

นำ x ผ่าน activation ฟังก์ชัน ได้ค่า y

In [5]:
activation = torch.nn.Sigmoid()
y1 = activation(x)
In [6]:
y1
Out[6]:
tensor([4.5398e-05, 4.5854e-05, 4.6315e-05,  ..., 9.9995e-01, 9.9995e-01,
        9.9995e-01])
In [7]:
activation = torch.nn.ReLU()
y3 = activation(x)
In [8]:
y3
Out[8]:
tensor([0.0000, 0.0000, 0.0000,  ..., 9.9700, 9.9800, 9.9900])

แสดงกราฟ

In [9]:
plt.ylim(top=2.0, bottom=-0.5)
plt.xlim(right=2.0, left=-2.0)
plt.grid()

plt.plot(x.numpy(), y1.numpy())
plt.plot(x.numpy(), y3.numpy())

plt.legend(['Sigmoid', 'ReLU'], loc='upper left')
plt.show()

Leaky ReLU

ด้วยค่า negative_slope = 0.05

In [10]:
activation = torch.nn.LeakyReLU(0.05)
y4 = activation(x)

แสดงกราฟ

In [11]:
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12,6))
fig.suptitle('Comparing ReLU and LeakyReLU')
ax1.set_xlim([-3, 3])
ax1.set_ylim([-1, 3])
ax1.grid()
ax1.set_title('ReLU')
ax2.set_xlim([-3, 3])
ax2.set_ylim([-1, 3])
ax2.grid()
ax2.set_title('LeakyReLU')

ax1.plot(x.numpy(), y3.numpy())
ax2.plot(x.numpy(), y4.numpy())
Out[11]:
[<matplotlib.lines.Line2D at 0x7f9942bd20f0>]
In [ ]:
 

ข้อดีของ ReLU Function

  1. Slope เป็น 1 ทำให้ Gradient ไม่หาย ลดปัญหา Vanishing Gradient ช่วยให้เราเทรนโมเดลได้อย่างรวดเร็ว
  2. หา Derivative ไม่ยาก Derivative เป็น 0 ไม่ก็ 1 ขึ้นกับ Input
  3. ใช้แล้วโมเดล Converge เร็วขึ้นมาก

ข้อเสียของ ReLU Function

  1. Output ไม่ Balance มี Mean ไม่เท่ากับ 0 เพราะมีแต่ค่าเป็นบวก ทำให้ Optimize ยาก
  2. Output อยู่ในช่วง 0-Infinity ไม่มี Limit จัดการลำบาก
  3. ถ้า Input เป็นค่าติดลบ Output จะเป็น 0 เสมอ ทำให้ยากต่อการแปลงค่ากลับ

แต่ข้อดีที่ Gradient ไม่หาย ลดปัญหา Vanishing Gradient ทำให้เราเทรนโมเดลได้รวดเร็ว ชนะทุกสิ่ง ทำให้เรามองข้ามข้อเสียของมันไป (ข้อเสียเหล่านี้ยังพอจัดการได้ แต่ Gradient หายแก้ไม่ได้)

เรื่อง Gradient จะอธิบายต่อไป ในหัวข้อ Optimization

มีผู้ออกแบบ Leaky ReLU เพื่อมาแก้ไขข้อเสียของ ReLU โดยแทนที่ Output จะเป็น 0 เสมอ ถ้า Input ติดลบ ก็ให้เป็นค่าติดลบน้อย ๆ แทน จะได้ยังสามารถแปลงค่ากลับได้ แต่ก็ยังไม่ค่อยได้รับความนิยมเท่าที่ควร

Train Neural Network

Deep Neural Network with 2 Hidden Layers using ReLU

Train Neural Network using ReLU. Credit https://playground.tensorflow.org
Train Neural Network using ReLU. Credit https://playground.tensorflow.org

สังเกตว่าเพียง 61 Epoch เท่านั้น ก็ Converge แถมช่วงแรก Training Loss และ Test Loss ลดลงเร็วมาก เปรียบเทียบกับ Tanh 100+ Epoch, Sigmoid 1000+ Epoch

Credit

แชร์ให้เพื่อน:

Keng Surapong on FacebookKeng Surapong on GithubKeng Surapong on Linkedin
Keng Surapong
Data Science Manager at Bua Labs
The ultimate test of your knowledge is your capacity to convey it to another.

Published by Keng Surapong

The ultimate test of your knowledge is your capacity to convey it to another.