Work in progress
This commit is contained in:
140
PytorchTutorialCodes/2_pred_with_numpy_explanation.md
Normal file
140
PytorchTutorialCodes/2_pred_with_numpy_explanation.md
Normal file
@ -0,0 +1,140 @@
|
||||
<img src="https://r2cdn.perplexity.ai/pplx-full-logo-primary-dark%402x.png" style="height:64px;margin-right:32px"/>
|
||||
|
||||
# Kódrészlet magyarázata lépésről lépésre
|
||||
|
||||
Ez a kód egy **egyszerű polinomiális regressziót** valósít meg Pythonban, Numpy segítségével, hogy egy szinuszhullámot közelítsen egy harmadfokú polinommal. Ez még nem PyTorch, hanem "kézzel" írt gépi tanulás, de a logika ugyanaz, mint amit PyTorch-ban is használnál.
|
||||
|
||||
## 1. Adatok előállítása
|
||||
|
||||
```python
|
||||
x = np.linspace(-math.pi, math.pi, 2000)
|
||||
y = np.sin(x)
|
||||
```
|
||||
|
||||
- **x**: 2000 darab egyenletesen elosztott pont -π és π között.
|
||||
- **y**: minden x-hez kiszámolja a szinusz értékét. Ez lesz a "valódi" függvény, amit közelíteni akarunk.
|
||||
|
||||
|
||||
## 2. Súlyok (együtthatók) véletlenszerű inicializálása
|
||||
|
||||
```python
|
||||
a = np.random.randn()
|
||||
b = np.random.randn()
|
||||
c = np.random.randn()
|
||||
d = np.random.randn()
|
||||
```
|
||||
|
||||
- Ezek a polinom együtthatói: $y = a + b x + c x^2 + d x^3$
|
||||
- Kezdetben véletlen értékek, a tanulás során ezek fognak "tanulni".
|
||||
|
||||
|
||||
## 3. Tanulási ráta beállítása
|
||||
|
||||
```python
|
||||
learning_rate = 1e-6
|
||||
```
|
||||
|
||||
- Ez határozza meg, hogy a súlyok mennyit változnak minden lépésben.
|
||||
|
||||
|
||||
## 4. Tanítási ciklus (iterációk)
|
||||
|
||||
```python
|
||||
for t in range(2000):
|
||||
# ...
|
||||
```
|
||||
|
||||
- 2000-szer ismétli a tanulási lépéseket.
|
||||
|
||||
|
||||
### 4.1. Előrehaladás (forward pass)
|
||||
|
||||
```python
|
||||
y_pred = a + b * x + c * x ** 2 + d * x ** 3
|
||||
```
|
||||
|
||||
- A jelenlegi súlyokkal kiszámolja a polinom értékét minden x-re.
|
||||
- Ez a "becsült" függvény, amit a tanulás során javítunk.
|
||||
|
||||
|
||||
### 4.2. Veszteség (loss) kiszámítása
|
||||
|
||||
```python
|
||||
loss = np.square(y_pred - y).sum()
|
||||
```
|
||||
|
||||
- Megméri, mennyire tér el a becsült érték a valódi szinusz értéktől.
|
||||
- A négyzetes eltérések összegét számolja (ez a **Mean Squared Error** logikája).
|
||||
- Minden 100. lépésnél kiírja az aktuális veszteséget.
|
||||
|
||||
|
||||
### 4.3. Visszaterjesztés (backpropagation) – gradiens számítás
|
||||
|
||||
```python
|
||||
grad_y_pred = 2.0 * (y_pred - y)
|
||||
grad_a = grad_y_pred.sum()
|
||||
grad_b = (grad_y_pred * x).sum()
|
||||
grad_c = (grad_y_pred * x ** 2).sum()
|
||||
grad_d = (grad_y_pred * x ** 3).sum()
|
||||
```
|
||||
|
||||
- Kiszámolja, hogy a veszteség hogyan változik, ha az egyes együtthatókat kicsit módosítjuk (ez a **gradiens**).
|
||||
- Ez mutatja meg, milyen irányba kell "tolni" az együtthatókat, hogy a veszteség csökkenjen.
|
||||
|
||||
|
||||
### 4.4. Súlyok frissítése (gradient descent)
|
||||
|
||||
```python
|
||||
a -= learning_rate * grad_a
|
||||
b -= learning_rate * grad_b
|
||||
c -= learning_rate * grad_c
|
||||
d -= learning_rate * grad_d
|
||||
```
|
||||
|
||||
- Minden együtthatót módosít a gradiens irányába, a tanulási ráta mértékével.
|
||||
- Így a polinom egyre jobban fogja közelíteni a szinusz görbét.
|
||||
|
||||
|
||||
## 5. Eredmény kiírása
|
||||
|
||||
```python
|
||||
print(f'Result: y = {a} + {b} x + {c} x^2 + {d} x^3')
|
||||
```
|
||||
|
||||
- A tanulás végén kiírja a megtanult polinom együtthatóit.
|
||||
- Ezekkel az értékekkel a polinomod a lehető legjobban közelíti a szinusz hullámot a megadott x tartományban.
|
||||
|
||||
***
|
||||
|
||||
## Mit kellene látnod eredményként?
|
||||
|
||||
- A veszteség (loss) értéke a tanulás során **folyamatosan csökken** – ez azt jelenti, hogy a polinom egyre jobban közelíti a szinusz hullámot.
|
||||
- A végén kapsz egy polinomot, aminek az együtthatói (a, b, c, d) már "megtanulták" a szinusz hullám alakját.
|
||||
- Ha ábrázolod a $y$ (szinusz) és $y_{pred}$ (polinom) görbéket, a tanulás végén a két görbe nagyon hasonló lesz.
|
||||
|
||||
***
|
||||
|
||||
## Lépések összefoglalva
|
||||
|
||||
1. **Adatok előállítása**: x és y (szinusz értékek)
|
||||
2. **Súlyok inicializálása**: a, b, c, d
|
||||
3. **Tanulási ciklus**:
|
||||
- Előrehaladás: polinom kiszámítása
|
||||
- Veszteség: eltérés mérése
|
||||
- Gradiens: hogyan változtassunk a súlyokon
|
||||
- Súlyok frissítése: tanulás
|
||||
4. **Eredmény**: megtanult polinom együtthatók
|
||||
|
||||
***
|
||||
|
||||
Ha szeretnéd, segítek abban is, hogyan lehet ezt PyTorch-ban automatizálni, vagy hogyan ábrázolhatod a tanulás eredményét grafikonon!
|
||||
<span style="display:none">[^1][^2][^3]</span>
|
||||
|
||||
<div align="center">⁂</div>
|
||||
|
||||
[^1]: https://www.youtube.com/watch?v=oKNIr-iCb6g
|
||||
|
||||
[^2]: https://learn.microsoft.com/hu-hu/training/modules/understand-regression-machine-learning/
|
||||
|
||||
[^3]: https://www.youtube.com/watch?v=YAJ5XBwlN4o
|
||||
|
||||
Reference in New Issue
Block a user