อนุพันธ์บทบาทของฟังก์ชัน sigmoid ในโครงข่ายประสาทเทียม


18

ฉันพยายามเข้าใจบทบาทของอนุพันธ์ของฟังก์ชัน sigmoid ในโครงข่ายประสาท ป้อนคำอธิบายรูปภาพที่นี่

ครั้งแรกที่ฉันพล็อตฟังก์ชั่น sigmoid และอนุพันธ์ของคะแนนทั้งหมดจากการกำหนดโดยใช้หลาม บทบาทของอนุพันธ์นี้คืออะไร? ป้อนคำอธิบายรูปภาพที่นี่

import numpy as np
import matplotlib.pyplot as plt

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def derivative(x, step):
    return (sigmoid(x+step) - sigmoid(x)) / step

x = np.linspace(-10, 10, 1000)

y1 = sigmoid(x)
y2 = derivative(x, 0.0000000000001)

plt.plot(x, y1, label='sigmoid')
plt.plot(x, y2, label='derivative')
plt.legend(loc='upper left')
plt.show()

2
หากคุณมีคำถามเพิ่มเติมอย่าลังเลที่จะถาม
JahKnows

คำตอบ:


23

การใช้งานของสัญญาซื้อขายล่วงหน้าในโครงข่ายประสาทเทียมสำหรับขั้นตอนการฝึกอบรมที่เรียกว่าแพร่กระจายย้อนกลับ เทคนิคนี้ใช้การไล่ระดับสีแบบไล่ลำดับเพื่อค้นหาชุดพารามิเตอร์ที่ดีที่สุดเพื่อลดฟังก์ชั่นการสูญเสีย ในตัวอย่างของคุณคุณต้องใช้อนุพันธ์ของ sigmoidเพราะนั่นคือการเปิดใช้งานที่เซลล์ประสาทส่วนบุคคลของคุณใช้


ฟังก์ชั่นการสูญเสีย

สาระสำคัญของการเรียนรู้ของเครื่องคือการเพิ่มประสิทธิภาพฟังก์ชั่นค่าใช้จ่ายเพื่อให้เราสามารถลดหรือเพิ่มฟังก์ชั่นเป้าหมายบางอย่าง โดยทั่วไปเรียกว่าการสูญเสียหรือ funtion ค่าใช้จ่าย โดยทั่วไปแล้วเราต้องการลดฟังก์ชั่นนี้ ฟังก์ชั่นค่าใช้จ่าย, , เชื่อมโยงการลงโทษบางอย่างขึ้นอยู่กับข้อผิดพลาดที่เกิดขึ้นเมื่อส่งผ่านข้อมูลผ่านแบบจำลองของคุณเป็นฟังก์ชั่นของพารามิเตอร์แบบจำลองC

ลองดูตัวอย่างที่เราพยายามติดป้ายว่ารูปภาพมีแมวหรือสุนัขหรือไม่ ถ้าเรามีรูปแบบที่สมบูรณ์แบบเราสามารถให้รูปแบบและมันจะบอกเราว่ามันเป็นแมวหรือสุนัข อย่างไรก็ตามไม่มีโมเดลที่สมบูรณ์และจะทำผิดพลาด

เมื่อเราฝึกแบบจำลองของเราเพื่อให้สามารถอนุมานความหมายจากข้อมูลอินพุตเราต้องการลดจำนวนข้อผิดพลาดที่เกิดขึ้น ดังนั้นเราจึงใช้ชุดฝึกอบรมข้อมูลนี้มีรูปภาพสุนัขและแมวจำนวนมากและเรามีป้ายกำกับความจริงที่เกี่ยวข้องกับภาพนั้น ทุกครั้งที่เราทำการฝึกซ้ำของแบบจำลองเราคำนวณต้นทุน (จำนวนข้อผิดพลาด) ของแบบจำลอง เราจะต้องการลดค่าใช้จ่ายนี้

ฟังก์ชั่นค่าใช้จ่ายจำนวนมากมีอยู่เพื่อวัตถุประสงค์ของตนเอง ฟังก์ชั่นค่าใช้จ่ายทั่วไปที่ใช้เป็นค่าใช้จ่ายกำลังสองซึ่งถูกกำหนดเป็น

2C=1Ni=0N(y^y)2

นี่คือความแตกต่างระหว่างป้ายกำกับที่คาดการณ์กับป้ายกำกับความจริงภาคพื้นดินสำหรับภาพที่เราฝึกมา เราจะต้องการย่อขนาดนี้ให้เล็กลงN

ลดฟังก์ชั่นการสูญเสียให้น้อยที่สุด

อันที่จริงแล้วการเรียนรู้ของเครื่องจักรส่วนใหญ่นั้นเป็นเพียงกรอบการทำงานที่มีความสามารถในการพิจารณาการกระจายโดยการลดฟังก์ชั่นค่าใช้จ่าย คำถามที่เราสามารถถามได้คือ "เราจะลดฟังก์ชั่นได้อย่างไร"

ลองย่อฟังก์ชั่นต่อไปนี้

6y=x24x+6

ถ้าเราพล็อตนี้เราจะเห็นว่ามีขั้นต่ำที่ 2 ในการทำสิ่งนี้เราสามารถหาอนุพันธ์ของฟังก์ชันนี้ได้x=2

dydx=2x4=0

2x=2

อย่างไรก็ตามบ่อยครั้งที่การค้นหาการวิเคราะห์ขั้นต่ำระดับโลกไม่สามารถทำได้ ดังนั้นเราจึงใช้เทคนิคการเพิ่มประสิทธิภาพแทน นี่คือวิธีที่แตกต่างกันเป็นจำนวนมากที่มีอยู่เช่น: Newton-Raphson ค้นหาตาราง ฯลฯ กลุ่มคนเหล่านี้เป็นเชื้อสายลาด นี่คือเทคนิคที่ใช้โดยเครือข่ายประสาท

โคตรลาด

ลองใช้การเปรียบเทียบที่ใช้ชื่อเสียงเพื่อทำความเข้าใจสิ่งนี้ ลองนึกภาพปัญหาการย่อขนาด 2D นี่เทียบเท่ากับการปีนเขาที่เป็นภูเขาในถิ่นทุรกันดาร คุณต้องการกลับไปที่หมู่บ้านที่คุณรู้ว่าอยู่ที่จุดต่ำสุด แม้ว่าคุณจะไม่ทราบทิศทางสำคัญของหมู่บ้าน สิ่งที่คุณต้องทำคือเดินลงไปเรื่อย ๆ และในที่สุดคุณก็จะไปถึงหมู่บ้าน ดังนั้นเราจะลงมาตามพื้นผิวตามความชันของความลาดชัน

มาฟังก์ชั่นของเรากัน

y=x24x+6

เราจะหาค่าที่yถูกย่อให้เล็กสุด ขั้นตอนวิธีการไล่โทนสีเชื้อสายแรกที่บอกว่าเราจะรับค่าสุ่มสำหรับx ให้เราเริ่มต้นที่x = 8xyxx=8 8จากนั้นอัลกอริทึมจะทำสิ่งต่อไปนี้ซ้ำ ๆ จนกว่าเราจะมาบรรจบกัน

xnew=xoldνdydx

เมื่อเป็นอัตราการเรียนรู้เราสามารถตั้งค่านี้เป็นค่าใดก็ได้ที่เราต้องการ อย่างไรก็ตามมีวิธีที่ชาญฉลาดในการเลือกสิ่งนี้ ใหญ่เกินไปและเราจะไม่ถึงค่าต่ำสุดของเราและใหญ่เกินไปเราจะเสียเวลามากเกินไปก่อนที่เราจะไปถึงที่นั่น มันคล้ายกับขนาดของขั้นตอนที่คุณต้องการลดความชันลง ก้าวเล็ก ๆ และคุณจะตายบนภูเขาคุณจะไม่มีวันลง ขั้นตอนใหญ่เกินไปและคุณเสี่ยงที่จะยิงหมู่บ้านและสิ้นสุดที่อีกด้านหนึ่งของภูเขา อนุพันธ์คือวิธีการที่เราเดินทางไปตามความชันนี้ไปสู่ค่าต่ำสุดของเราν

dydx=2x4

ν=0.1

การวนซ้ำ 1:

x n e w = 6.8 - 0.1 ( 2 6.8 - 4 ) = 5.84 x n e w = 5.84 - 0.1 ( 2 5.84 - 4 ) = 5.07 x n e w = ( 2 xnew=80.1(284)=6.8
xnew=6.80.1(26.84)=5.84
xnew=5.840.1(25.844)=5.07
x n e w = 4.45 - 0.1 ( 2 4.45 - 4 ) = 3.96 x n e w = 3.96 - 0.1 ( 2 3.96 - 4 ) = 3.57 x n e w = 3.57 - 0.1 ( 2 3.57 - 4 )xnew=5.070.1(25.074)=4.45
xnew=4.450.1(24.454)=3.96
xnew=3.960.1(23.964)=3.57
x n E Wxnew=3.570.1(23.574)=3.25
x n e w = 3.00 - 0.1 ( 2 3.00 - 4 ) = 2.80 x n e w = 2.80 - 0.1 ( 2 2.80 - 4 ) = 2.64 x n e w =xnew=3.250.1(23.254)=3.00
xnew=3.000.1(23.004)=2.80
xnew=2.800.1(22.804)=2.64
x n e w = 2.51 - 0.1 ( 2 2.51 - 4 ) = 2.41 x n e w = 2.41 - 0.1 ( 2 2.41 - 4 ) = 2.32 x n e w = 2.32 - 0.1 ( 2 2.32xnew=2.640.1(22.644)=2.51
xnew=2.510.1(22.514)=2.41
xnew=2.410.1(22.414)=2.32
xnew=2.320.1(22.324)=2.26
xnew=2.260.1(22.264)=2.21
xnew=2.210.1(22.214)=2.16
xnew=2.160.1(22.164)=2.13
xnew=2.130.1(22.134)=2.10
xnew=2.100.1(22.104)=2.08
xnew=2.080.1(22.084)=2.06
xnew=2.060.1(22.064)=2.05
xnew=2.050.1(22.054)=2.04
xnew=2.040.1(22.044)=2.03
xnew=2.030.1(22.034)=2.02
xnew=2.020.1(22.024)=2.02
xnew=2.020.1(22.024)=2.01
xnew=2.010.1(22.014)=2.01
xnew=2.010.1(22.014)=2.01
xnew=2.010.1(22.014)=2.00
xnew=2.000.1(22.004)=2.00
xnew=2.000.1(22.004)=2.00
xnew=2.000.1(22.004)=2.00
xnew=2.000.1(22.004)=2.00

And we see that the algorithm converges at x=2! We have found the minimum.


Applied to neural networks

The first neural networks only had a single neuron which took in some inputs x and then provide an output y^. A common function used is the sigmoid function

σ(z)=11+exp(z)

y^(wTx)=11+exp(wTx+b)

where w is the associated weight for each input x and we have a bias b. We then want to minimize our cost function

C=12Ni=0N(y^y)2.

How to train the neural network?

We will use gradient descent to train the weights based on the output of the sigmoid function and we will use some cost function C and train on batches of data of size N.

C=12NiN(y^y)2

y^ is the predicted class obtained from the sigmoid function and y is the ground truth label. We will use gradient descent to minimize the cost function with respect to the weights w. To make life easier we will split the derivative as follows

Cw=Cy^y^w.

Cy^=y^y

and we have that y^=σ(wTx) and the derivative of the sigmoid function is σ(z)z=σ(z)(1σ(z)) thus we have,

y^w=11+exp(wTx+b)(111+exp(wTx+b)).

So we can then update the weights through gradient descent as

wnew=woldηCw

where η is the learning rate.


2
please tell me why is this process not so nicely described in books? Do you have a blog? What materials for learning neural networks do you recommend? I have test data and I want to train it. Can I draw a function that I will minimize? I would like to visualize this process to better understand it.
lukassz

Can you explain backpropagation in this simple way?
lukassz

1
Amazing Answer...(+1)
Aditya

1
Backprop is also similar to what JahKnows has Explained above... Its just the gradient is carried all the way to the inputs right from the outputs.. A quick google search will make this clear.. Also the same goes every other activation functions also..
Aditya

1
@lukassz, notice that his equation is the same as the one I have for the weight update in the before last equation. Cw=(y^y)derivative of sigmoid. He uses the same cost function as me, dont forget that you need to take the derivative of the loss function too, that becomes y^y, where y^ are the predicted labels and y are the ground truth labels.
JahKnows

2

During the phase where the neural network generates its prediction, it feeds the input forward through the network. For each layer, the layer's input X goes first through an affine transformation WX+b and then is passed through the sigmoid function σ(WX+b).

In order to train the network, the output y^ is then compared to the expected output (or label) y through a cost function L(y,y^)=L(y,σ(WX+b)). The goal of the whole training procedure is to minimize that cost function. In order to do that, a technique called gradient descent is performed which calculates how we should change W and b so that the cost reduces.

Gradient Descent requires calculating the derivative of the cost function w.r.t W and b. In order to do that we must apply the chain rule, because the derivative we need to calculate is a composition of two functions. As dictated by the chain rule we must calculate the derivative of the sigmoid function.

One of the reasons that the sigmoid function is popular with neural networks, is because its derivative is easy to compute.


1

In simple words:

Derivative shows neuron's ability to learn on particular input.

For example if input is 0 or 1 or -2, the derivative (the "learning ability") is high and back-propagation will improve neuron's weights for this sample dramatically.

On other hand, if input is 20, the the derivative will be very close to 0. It means that back-propagation on this sample will not "teach" this neuron to produce a better result.

The things above are valid for a single sample.

Let's look at the bigger picture, for all samples in the training set. Here we have several situations:

  • If derivative is 0 for all samples in your training set AND neuron always produces wrong results - it means the neuron is saturated (dumb) and will not improve.
  • If derivative is 0 for all samples in your training set AND neuron always produces correct results - it means the neuron have been studying really well and already as smart as it could (side note: this case is good but it may indicate potential overfitting, which is not good)

  • If derivative is 0 on some samples, non-0 on other samples AND neuron produces mixed results - it indicates that this neuron doing some good work and potentially may improve from further training (though not necessarily as it depends on other neurons and training data you have)

So, when you are looking at the derivative plot, you can see how much the neuron prepared to learn and absorb the new knowledge, given a particular input.


0

The derivative you see here is important in neural networks. It's the reason why people generally prefer something else such as rectified linear unit.

Do you see the derivative drop for the two ends? What if your network is on the very left side, but it needs to move to the right side? Imagine you're on -10.0 but you want 10.0. The gradient will be too small for your network to converge quickly. We don't want to wait, we want quicker convergence. RLU doesn't have this problem.

We call this problem "Neural Network Saturation".

Please see https://www.quora.com/What-is-special-about-rectifier-neural-units-used-in-NN-learning

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.