Published on

๐Ÿ“–STUDY ์›น ๋ธŒ๋ผ์šฐ์ € ์† ๋จธ์‹ ๋Ÿฌ๋‹ Tensorflow.js | ๋‹คํ•ญํšŒ๊ท€

๋‹คํ•ญํšŒ๊ท€

: ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ์…‹์˜ ๋ชฉํ‘ฏ๊ฐ’์„ ์˜ˆ์ธกํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋จธ์‹ ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜.

  • ์ง€๋„ํ•™์Šต: ๋ช…์‹œ์ ์ธ ๋ชฉํ‘ฏ๊ฐ’(label)๊ณผ ํ•จ๊ป˜ ํ›ˆ๋ จ โžก ์ตœ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜์˜ํ•˜๋Š” ํ•จ์ˆ˜(objective function)๋ฅผ ๋งŒ๋“ฆ
  • ์„ ํ˜• ๋ชจ๋ธ(linear model): y=ฮฒ0+ฮฒ1x1+ฮฒ2x2+โ€ฆ+ฮฒpxp+ฮตy = \beta_0 + \beta_1x_1 + \beta_2x_2 + \ldots + \beta_px_p + \varepsilon
  • ์†์‹ค ํ•จ์ˆ˜(loss function): ์˜ˆ์ธก๊ณผ ์ƒ˜ํ”Œ๊ฐ„์˜ ์˜ค์ฐจ ex. mean squared error
  • Optimizer: ์ตœ์ ๊ฐ’์„ ์ฐพ์•„๋‚˜๊ฐ, ์ตœ์ ํ™”ํ•จ์— ๋”ฐ๋ผ ๋‹จ์กฐ ๊ฐ์†Œ ๊ณผ์ •์„ ๊ฑฐ์นจ. ์ด ๊ณผ์ •์—์„œ ์†์‹ค ํ•จ์ˆ˜๋Š” ๋ฏธ๋ถ„์ด ๊ฐ€๋Šฅํ•ด์•ผํ•˜๋ฉฐ, ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ์•„์•ผํ•จ.
    • gradient descent: ฮธj:=ฮธjโˆ’ฮฑโˆ‡J(ฮธ)\theta_{j} := \theta_{j} - \alpha \nabla J(\theta)
    • J(ฮธ+ฮ”ฮธ)โˆ’J(ฮธ)โ‰ˆโˆ‡J(ฮธ)Tฮ”ฮธ+12ฮ”ฮธTHฮ”ฮธJ(\theta + \Delta\theta) - J(\theta) \approx \nabla J(\theta)^T \Delta\theta + \frac{1}{2}\Delta\theta^T H \Delta\theta
  • Underfitting: ๊ณผํ•˜๊ฒŒ ๋‹จ์ˆœํ™” โžก ์†์‹ค๊ฐ’์ด ์ž‘๋”๋ผ๋„ ๋ฐœ์ƒ
  • Overfitting: ๊ณผํ•˜๊ฒŒ ๋ณต์žกํ™” โžก ์†์‹ค๊ฐ’์ด ์ž‘๋”๋ผ๋„ ๋ฐœ์ƒ
import * as tf from "@tensorflow/tfjs";

const doublePi = tf.scalar(2.0, Math.PI);
const xs = tf.mul(doublePi, tf.range(-0.5, 0.5, 0.01));
const noise = tf.randomNormal([xs.size]).mul(0.05);
const ys = tf.sin(xs).add(noise);

const w0 = tf.scalar(Math.random() - 0.5).variable();
const w1 = tf.scalar(Math.random() - 0.5).variable();
const w2 = tf.scalar(Math.random() - 0.5).variable();

const f_x = (x) => {
  return w2.mul(x).mul(x).add(w1.mul(x)).add(w0);
};

const loss = (pred, label) => pred.sub(label).square().mean();
const learningRate = 0.3;
const optimizer = tf.train.adam(learningRate);

for (let i = 0; i < 100; i++) {
  const l = optimizer.minimize(() => loss(f_x(xs), ys), true);
  losses.push(l.dataSync());
}
Authors