Αρχή

Machine Learning 9: Παράδειγμα Stochastic Gradient Descent - Υδροστατική Πίεση

1. Θεωρία Υδροστατικής Πίεσης

Η υδροστατική πίεση είναι η πίεση που ασκεί ένα υγρό λόγω του βάρους της στήλης του. Η πίεση αυξάνεται γραμμικά με το βάθος.

P = ρ g h

Για το νερό περίπου:

P ≈ 9.81 h (kPa/m)

2. Γραμμικό μοντέλο Machine Learning

Το μοντέλο που θα εκπαιδεύσουμε είναι:

P = w h + b

Το SGD θα μάθει τις παραμέτρους w και b από τα δεδομένα.

3. Dataset (100 δείγματα)

ID Depth (m) Pressure (kPa)
10.10.97
20.22.01
30.32.85
40.43.94
50.54.88
60.65.93
70.76.84
80.87.82
90.98.97
101.09.76
111.110.82
121.211.78
131.312.70
141.413.89
151.514.71
161.615.82
171.716.63
181.817.77
191.918.69
202.019.71
212.120.55
222.221.70
232.322.61
242.423.63
252.524.60
262.625.48
272.726.70
282.827.42
292.928.61
303.029.50
313.130.48
323.231.33
333.332.58
343.433.37
353.534.44
363.635.37
373.736.41
383.837.12
393.938.25
404.039.33
414.140.12
424.241.36
434.342.22
444.443.29
454.544.09
464.645.23
474.746.15
484.847.21
494.948.10
505.049.07
515.150.15
525.251.11
535.352.06
545.453.23
555.553.99
565.655.02
575.756.18
585.856.99
595.958.00
606.058.96
616.160.02
626.260.86
636.361.99
646.462.74
656.563.93
666.664.67
676.765.85
686.866.74
696.967.70
707.068.64
717.169.82
727.270.53
737.371.67
747.472.70
757.573.51
767.674.70
777.775.45
787.876.63
797.977.44
808.078.55
818.179.53
828.280.33
838.381.64
848.482.21
858.583.45
868.684.19
878.785.34
888.886.26
898.987.19
909.088.41
919.189.15
929.290.32
939.391.18
949.492.31
959.593.26
969.694.12
979.795.31
989.896.02
999.997.29
10010.098.04

4. Κώδικας Python για SGD

import numpy as np import matplotlib.pyplot as plt # Dataset (ίδιο με τον πίνακα πάνω) depth = np.array([ 0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0, 1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0, 2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9,3.0, 3.1,3.2,3.3,3.4,3.5,3.6,3.7,3.8,3.9,4.0, 4.1,4.2,4.3,4.4,4.5,4.6,4.7,4.8,4.9,5.0, 5.1,5.2,5.3,5.4,5.5,5.6,5.7,5.8,5.9,6.0, 6.1,6.2,6.3,6.4,6.5,6.6,6.7,6.8,6.9,7.0, 7.1,7.2,7.3,7.4,7.5,7.6,7.7,7.8,7.9,8.0, 8.1,8.2,8.3,8.4,8.5,8.6,8.7,8.8,8.9,9.0, 9.1,9.2,9.3,9.4,9.5,9.6,9.7,9.8,9.9,10.0 ]) pressure = np.array([ 1.2,1.9,2.8,4.3,4.9,6.2,6.7,8.0,9.3,9.9, 10.5,11.6,12.9,13.1,15.0,15.7,16.5,17.8,18.3,19.9, 20.4,21.8,22.1,23.9,24.3,25.8,26.7,27.2,28.5,29.7, 30.1,31.8,32.5,33.2,34.9,35.1,36.4,37.6,38.1,39.4, 40.5,41.3,42.6,43.9,44.0,45.2,46.8,47.1,48.3,49.6, 50.2,51.4,52.7,53.5,54.8,55.0,56.9,57.1,58.2,59.4, 60.3,61.7,62.1,63.9,64.5,65.6,66.2,67.8,68.0,69.5, 70.4,71.3,72.9,73.1,74.6,75.3,76.8,77.2,78.4,79.6, 80.3,81.8,82.6,83.5,84.7,85.0,86.4,87.3,88.8,89.1, 90.2,91.5,92.4,93.6,94.1,95.7,96.2,97.4,98.5,99.1 ]) # αρχικές τιμές w = 0 b = 0 learning_rate = 0.0001 epochs = 50 n = len(depth) for epoch in range(epochs): for i in range(n): x = depth[i] y = pressure[i] y_pred = w*x + b dw = -2*x*(y - y_pred) db = -2*(y - y_pred) w = w - learning_rate*dw b = b - learning_rate*db print("Learned slope:", w) print("Learned bias:", b) # visualization plt.scatter(depth, pressure) plt.plot(depth, w*depth + b) plt.xlabel("Depth (m)") plt.ylabel("Pressure") plt.title("SGD Linear Regression") plt.show()

5. Ανάλυση του Κώδικα Βήμα προς Βήμα

Βήμα 1 – Εισαγωγή βιβλιοθηκών

Χρησιμοποιούμε τις βιβλιοθήκες NumPy και Matplotlib για αριθμητικούς υπολογισμούς και γραφήματα.

Βήμα 2 – Εισαγωγή δεδομένων

Οι πίνακες depth και pressure περιέχουν τις τιμές από τον πίνακα δεδομένων του μαθήματος.

Βήμα 3 – Αρχικοποίηση του μοντέλου

Το γραμμικό μοντέλο έχει τη μορφή:

P = w · h + b

w = 0
b = 0

Στην αρχή οι παράμετροι είναι τυχαίες ή μηδενικές. Το μοντέλο δεν γνωρίζει ακόμα τη σχέση μεταξύ βάθους και πίεσης.

Βήμα 4 – Learning rate

Το learning rate καθορίζει πόσο μεγάλο βήμα θα κάνει το gradient descent.

learning_rate = 0.001

Αν είναι πολύ μεγάλο η εκπαίδευση γίνεται ασταθής. Αν είναι πολύ μικρό η εκπαίδευση γίνεται πολύ αργή.

Βήμα 5 – Εκπαίδευση με Stochastic Gradient Descent

Η εκπαίδευση γίνεται με δύο βρόχους.

for epoch in range(epochs):
    for i in range(n):

Ο εξωτερικός βρόχος επαναλαμβάνει την εκπαίδευση πολλές φορές (epochs). Ο εσωτερικός βρόχος περνάει από κάθε δείγμα του dataset.

Στο Stochastic Gradient Descent η ενημέρωση των παραμέτρων γίνεται για κάθε δείγμα ξεχωριστά.

Βήμα 6 – Πρόβλεψη του μοντέλου

y_pred = w*x + b

Το μοντέλο υπολογίζει την προβλεπόμενη πίεση για το συγκεκριμένο βάθος.

Βήμα 7 – Υπολογισμός του gradient

Η συνάρτηση σφάλματος για ένα δείγμα είναι:

L = (y - y_pred)^2

και η προβλεπόμενη τιμή:

y_pred = w * x + b

Θέλουμε:

∂L/∂w = ∂/∂w (y - (w * x + b))^2

Με τον κανόνα της αλυσίδας:

u = y - (w * x + b)
∂L/∂w = 2 * u * ∂u/∂w
∂u/∂w = -x
∂L/∂w = -2 * x * (y - y_pred)
∂L/∂b = 2 * (y - y_pred) * ∂(y - (w*x+b))/∂b
∂(y - (w*x+b))/∂b = -1
∂L/∂b = -2 * (y - y_pred)
dw = -2*x*(y - y_pred)
db = -2*(y - y_pred)

Το gradient δείχνει προς ποια κατεύθυνση πρέπει να αλλάξουν οι παράμετροι ώστε να μειωθεί το σφάλμα.

Βήμα 8 – Ενημέρωση παραμέτρων

w = w - learning_rate*dw
b = b - learning_rate*db

Οι παράμετροι ενημερώνονται ώστε το μοντέλο να προσεγγίζει καλύτερα τα δεδομένα.

Βήμα 10 – Οπτικοποίηση

plt.scatter(depth,pressure)
plt.plot(depth,w*depth+b)

Το γράφημα δείχνει:

Αν η εκπαίδευση έχει γίνει σωστά, η γραμμή θα προσεγγίζει τη φυσική σχέση της υδροστατικής πίεσης.

Πράγματι, έχουμε γραμμική σχέση και ο κώδικας δίνει: Learned slope: 9.756137962980114 Learned bias: 1.1770466869608571

SGD Βήμα-Βήμα – Υδροστατική Πίεση

Ας δούμε αναλυτικά **τρία βήματα** του Stochastic Gradient Descent για ένα μόνο δείγμα από το dataset:

Βήμα 1 – Πρόβλεψη (Prediction)

Το μοντέλο έχει τη μορφή:

P = w * h + b

Αρχικά οι παράμετροι είναι:

w = 0
b = 0

Για το πρώτο δείγμα (βάθος h = 0.1 m, πίεση P = 0.97 kPa):

y_pred = w * h + b = 0 * 0.1 + 0 = 0

Προβλεπόμενη πίεση: 0 kPa.

Βήμα 2 – Υπολογισμός Gradient

Υπολογίζουμε πόσο πρέπει να αλλάξουν οι παράμετροι για να μειωθεί το σφάλμα:

dw = -2 * h * (y - y_pred)

db = -2 * (y - y_pred)

Αντικαθιστούμε:

dw = -2 * 0.1 * (0.97 - 0) = -0.194
db = -2 * (0.97 - 0) = -1.94

Το gradient μας λέει προς ποια κατεύθυνση πρέπει να κινηθούμε.

Βήμα 3 – Ενημέρωση Παραμέτρων

Με ένα learning rate lr = 0.01:

w = w - lr * dw = 0 - 0.01 * (-0.194) = 0.00194
b = b - lr * db = 0 - 0.01 * (-1.94) = 0.0194

Μετά το επόμενο δείγμα, επαναλαμβάνουμε τα ίδια βήματα, και σιγά-σιγά η γραμμή πλησιάζει τα πραγματικά δεδομένα.

Δείγμα: x = 0.2, y = 2.01
Παράμετροι μετά από iteration 1: w = 0.00194, b = 0.0194

y_pred = w*x + b = 0.00194*0.2 + 0.0194 ≈ 0.019788
dw = -2 * 0.2 * (2.01 - 0.019788) ≈ -0.796
db = -2 * (2.01 - 0.019788) ≈ -3.9804

w_new = 0.00194 - 0.01*(-0.796) ≈ 0.00990
b_new = 0.0194 - 0.01*(-3.9804) ≈ 0.0592

Δείγμα: x = 0.3, y = 2.85
Παράμετροι: w = 0.00990, b = 0.0592

y_pred = w*x + b = 0.00990*0.3 + 0.0592 ≈ 0.06217
dw = -2 * 0.3 * (2.85 - 0.06217) ≈ -1.686
db = -2 * (2.85 - 0.06217) ≈ -5.5757

w_new = 0.00990 - 0.01*(-1.686) ≈ 0.02676
b_new = 0.0592 - 0.01*(-5.5757) ≈ 0.11495

Συνέχιση Iterations

Το ίδιο βήμα εφαρμόζεται σε όλα τα δείγματα. Με κάθε iteration (epoch), η γραμμή πλησιάζει σταδιακά όλα τα σημεία του dataset.

Με επαναλήψεις, το μοντέλο μαθαίνει την σχέση P ≈ 9.81*h.

Mini-batch Gradient Descent

Το Mini-batch Gradient Descent αποτελεί έναν συμβιβασμό μεταξύ του Stochastic Gradient Descent (SGD) και του Batch Gradient Descent. Αντί να υπολογίζει το gradient είτε για ένα μόνο δείγμα είτε για ολόκληρο το dataset, το υπολογίζει για μια μικρή ομάδα δειγμάτων (mini-batch) σταθερού μεγέθους. Με αυτόν τον τρόπο μειώνεται η διακύμανση στις ενημερώσεις των παραμέτρων, γεγονός που οδηγεί σε πιο σταθερή σύγκλιση του μοντέλου.

Βιβλιογραφία

St-Aubin, A. (n.d.). An introduction to supervised machine learning. McGill University.