MewwSikk
article thumbnail

์ด์ „์— ์˜ฌ๋ฆฐ Barlow Twins Architecture๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด์„œ tensorflow.keras.Model์˜ train_step() ํ•จ์ˆ˜๋ฅผ ๊ฑด๋“œ๋ฆด ์ผ์ด ์ƒ๊ฒผ๋Š”๋ฐ ํ•ด๋‹น ํ•จ์ˆ˜์—์„œ Gradient Tape๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ ์„ ๋ณด๊ณ  ๊ณต๋ถ€ํ•˜๋ฉฐ ์•„๋ž˜์˜ ๋ธ”๋กœ๊ทธ๋ฅผ ํ•„์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

https://rfriend.tistory.com/556

 

[TensorFlow] Gradient Tape์„ ์ด์šฉํ•œ ์ž๋™ ๋ฏธ๋ถ„๊ณผ ์˜ค์ฐจ์—ญ์ „ํŒŒ

์ž๋™๋ฏธ๋ถ„(Automatic differentiation, Algorithmic differentiation, computational differentiation, auto-differentiation, ๋˜๋Š” ์ค„์—ฌ์„œ ๊ฐ„๋‹จํžˆ auto-diff) ์€ ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ•ด์„œ ๊ตฌ์ฒดํ™”๋œ ํ•จ์ˆ˜์˜ ๋ฏธ๋ถ„์„ ์‚ฐ์ˆ ์ ์œผ๋กœ ๊ณ„์‚ฐ

rfriend.tistory.com


์ž๋™๋ฏธ๋ถ„(Automatic differentiation, Algorithmic differentiation, Computational differentiation, auto-differentiation)์€ ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ•ด์„œ ๊ตฌ์ฒดํ™”๋œ ํ•จ์ˆ˜์˜ ๋ฏธ๋ถ„์„ ์‚ฐ์ˆ ์ ์œผ๋กœ ๊ณ„์‚ฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ ์˜ ์ง‘ํ•ฉ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ•ด์„œ ๊ตฌ์ œํ™”๋œ ํ•จ์ˆ˜๋Š” ์•„๋ฌด๋ฆฌ ๋ณต์žกํ•ด๋ณด์ด๋”๋ผ๋„ ๊ธฐ๋ณธ์ ์ธ ์‚ฐ์ˆ  ์—ฐ์‚ฐ๊ณผ ๊ธฐ๋ณธ์ ์ธ ํ•จ์ˆ˜์˜ ์—ฐ์†์ ์ธ ์‹คํ–‰์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค๋Š” ์•„์ด๋””์–ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. 

๋ณต์žกํ•œ ํ•จ์ˆ˜๋„ ์—ฐ์‡„ ๋ฒ•์น™(Chain Rule)์„ ์ด์šฉํ•จ์œผ๋กœ์จ ํ•ฉ์„ฑํ•จ์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ ๊ธฐ๋ณธํ•จ์ˆ˜์˜ ๋ฏธ๋ถ„์˜ ๊ณฑ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๊ณ  ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ณ„์‚ฐํ•จ์œผ๋กœ์จ ์ž๋™์œผ๋กœ ๋ณต์žกํ•œ ํ•จ์ˆ˜๋ฅผ ์ •ํ™•ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋ฏธ๋ถ„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

์ž๋™๋ฏธ๋ถ„(Automatic Differentiation)์€ ๋”ฅ๋Ÿฌ๋‹์—์„œ ์˜ค์ฐจ ์—ญ์ „ํŒŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์„œ ๋ชจ๋ธ์„ ํ•™์Šตํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

Tensorflow์—์„œ๋Š” Gradient Tapes๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฆ‰์‹œ ์‹คํ–‰ ๋ชจ๋“œ(eager execution mode)์—์„œ ์‰ฝ๊ฒŒ ์˜ค์ฐจ ์—ญ์ „ํŒŒ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

ํ•ด๋‹น ํฌ์ŠคํŠธ์—๋Š” ์•„๋ž˜์˜ 5๊ฐ€์ง€์— ๋Œ€ํ•˜์—ฌ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

1. ์ฆ‰์‹œ ์‹คํ–‰ ๋ชจ๋“œ์—์„œ ์ž๋™๋ฏธ๋ถ„์„ ํ•˜๊ธฐ ์œ„ํ•ด Gradient tapes๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

2. Tensorflow์—์„œ Gradient Tapes๋ฅผ ์ด์šฉํ•˜์—ฌ ์ž๋™ ๋ฏธ๋ถ„์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•

3. ์‹œ๊ทธ๋ชจ์ด๋“œ(Sigmoid) ํ•จ์ˆ˜์˜ ์ž๋™ ๋ฏธ๋ถ„ ์‹œ๊ฐํ™”

4. ํ…Œ์ดํ”„๊ฐ€ ๋ณผ ๊ฒƒ์„ ์กฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ• (Controlling what the tape wathes)

5. Python ์กฐ๊ฑด์ ˆ ๋ถ„๊ธฐ๋ฌธ์„ ์ด์šฉํ•œ ํ…Œ์ดํ”„ ๊ธฐ๋ก ํ๋ฆ„ ์กฐ์ •(Control Flow)

 

๋˜ํ•œ Tensorflow ํŠœํ† ๋ฆฌ์–ผ์˜ ๋‚ด์šฉ์„ ๋ณ€์—ญํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ๋Œ€๋ถ€๋ถ„ ์‚ฌ์šฉํ•˜์˜€๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Tensorflow Tutorial URL: https://www.tensorflow.org/guide/autodiff?hl=en  

 

๊ทธ๋ž˜๋””์–ธํŠธ ๋ฐ ์ž๋™ ๋ฏธ๋ถ„ ์†Œ๊ฐœ  |  TensorFlow Core

PaLM API ๋ฐ MakerSuite Explore Generative AI๋ฅผ ์‚ฌ์šฉ ํ•˜์—ฌ Google์˜ ๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”. ๊ทธ๋ž˜๋””์–ธํŠธ ๋ฐ ์ž๋™ ๋ฏธ๋ถ„ ์†Œ๊ฐœ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด ์ •๋ฆฌํ•˜๊ธฐ ๋‚ด ํ™˜๊ฒฝ์„ค์ •์„ ๊ธฐ์ค€์œผ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ์ €์žฅํ•˜๊ณ 

www.tensorflow.org

์ „๋ฐ˜์ ์ธ ํ๋ฆ„


๋จผ์ € numpy, tensorflow, matplotlib ๋ชจ๋“ˆ์„ importํ•ฉ๋‹ˆ๋‹ค.

1. 1.  ์ฆ‰์‹œ ์‹คํ–‰ ๋ชจ๋“œ์—์„œ ์ž๋™ ๋ฏธ๋ถ„์„ ํ•˜๊ธฐ ์œ„ํ•ด Gradient Tapes๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

์˜ˆ๋ฅผ ๋“ค์–ด y=a*x๋ผ๋Š” ๋ฐฉ์ •์‹์—์„œ a์™€ y๊ฐ€ ์ƒ์ˆ˜(constant)์ด๊ณ  x๊ฐ€ ๋ณ€์ˆ˜(variable)์ผ ๋•Œ, ์ด ๋ฐฉ์ •์‹์„ ์˜ค์ฐจ ์—ญ์ „ํŒŒ๋ฒ•์„ ํ†ตํ•˜์—ฌ ๋ณ€์ˆ˜ x๋ฅผ ๊ตฌํ•˜๊ณ ์ž ํ•œ๋‹ค๊ณ  ํ•ฉ์‹œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ฐ„๋‹จํ•œ ์†์‹คํ•จ์ˆ˜์ธ loss=abs(a*x-y)๋ฅผ ์ตœ์†Œ๋กœ ํ•˜๋Š” x๋ฅผ ๊ตฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

์•„๋ž˜ ์˜ˆ์˜ ๊ฒฝ์šฐ 8.0=2.0*x ๋ฐฉ์ •์‹ ํ•จ์ˆ˜๋กœ๋ถ€ํ„ฐ ๋ณ€์ˆ˜ x์˜ ๊ฐ’์„ ๊ตฌํ•˜์ž๊ณ  ํ•ฉ์‹œ๋‹ค. x๋ฅผ 10.0์—์„œ ์‹œ์ž‘ํ•ด์„œ abs(a*x-y) ์†์‹คํ•จ์ˆ˜ ๊ฐ’์„ ์ตœ์†Œ๋กœ ํ•˜๋Š” x๋ฅผ ๊ตฌํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด '์†์‹คํ•จ์ˆ˜์— ๋Œ€ํ•œ x์˜ ๋ฏธ๋ถ„(the gradient of the loss with respect to x)'์„ ๊ตฌํ•ด์„œ x๊ฐ’์„ ๋ฏธ๋ถ„๊ฐ’๋งŒํผ ๋นผ์„œ ๊ฐฑ์‹ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

 

๊ทธ๋Ÿฐ๋ฐ ์•„๋ž˜์˜ Tensorflow 2.x ๋ฒ„์ „์—์„œ์˜ Python ์ฆ‰์‹œ ์‹คํ–‰๋ชจ๋“œ(eager mode)์—์„œ ์†์‹ค(Loss)์„ '์ฆ‰์‹œ ๊ณ„์‚ฐ(eager execution)'ํ•ด๋ฒ„๋ ค์„œ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด numpy=12.0์ธ Tensor์ƒ์ˆ˜ ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ž๋™ ๋ฏธ๋ถ„์„ ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ž๋™๋ฏธ๋ถ„์„ ํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜์™€ ๊ณ„์‚ฐ ์‹์˜ ์—ฐ์‚ฐ ๊ณผ์ •๊ณผ ์ž…๋ ฅ ๊ฐ’์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ฆ‰์‹œ์‹คํ–‰๋ชจ๋“œ์—์„œ๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. (์ž…๋ ฅ ๊ฐ’๊ณผ ์—ฐ์‚ฐ ๊ณผ์ •์€ ์ €์žฅ ์•ˆํ•˜๊ณ  ์ฆ‰์‹œ์‹คํ–‰ํ•ด์„œ ๊ฒฐ๊ณผ๋งŒ ์ถœ๋ ฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.)

2. 2. Tensorflow์—์„œ Gradient Tapes๋ฅผ ์ด์šฉํ•˜์—ฌ ์ž๋™๋ฏธ๋ถ„ ํ•˜๋Š” ๋ฐฉ๋ฒ•

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Tensorflow๋Š” ์ค‘๊ฐ„ ์—ฐ์‚ฐ ๊ณผ์ •(ํ•จ์ˆ˜, ์—ฐ์‚ฐ)์„ ํ…Œ์ดํ”„(Tape)์— ์ฐจ๊ณก์ฐจ๊ณก ๊ธฐ๋กํ•ด์ฃผ๋Š” Gradient Tapes๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

with tf.GradientTape() as tape: ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ €์žฅํ•  tape๋ฅผ ์ง€์ •ํ•ด์ฃผ๋ฉด, ์ดํ›„์˜ GradientTape() ๋ฌธ๋งฅ ์•„๋ž˜์˜ Tensorflow์˜ ์—ฐ๊ด€ ์—ฐ์‚ฐ ์ฝ”๋“œ๋Š” tape์— ์ €์žฅ์ด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ tape์— ์ €์žฅ๋œ ์—ฐ์‚ฐ ๊ณผ์ •(ํ•จ์ˆ˜, ์—ฐ์‚ฐ์‹)์„ ๊ฐ€์ ธ๋‹ค๊ฐ€ Tensorflow๋Š” dx=tape.gradient(loss,x)๋กœ ํ›„์ง„ ๋ชจ๋“œ ์ž๋™ ๋ฏธ๋ถ„ ๋ฐฉ๋ฒ•(Reverse mode automatic differentiation) ๋ฐฉ๋ฒ•์œผ๋กœ ์†์‹ค์— ๋Œ€ํ•œ x์˜ ๋ฏธ๋ถ„์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ณ„์‚ฐ๋œ ์†์‹ค์— ๋Œ€ํ•œ x์˜ ๋ฏธ๋ถ„์„ ์—ญ์ „ํŒŒ(backpropagation)ํ•˜์—ฌ x์˜ ๊ฐ’์„ ๊ฐฑ์‹ (update)ํ•˜๋Š” ์ž‘์—…์„ ๋ฐ˜๋ณตํ•จ์œผ๋กœ์จ ๋ณ€์ˆ˜ x์˜ ๋‹ต์„ ์ฐพ์•„๊ฐ€๋Š” ํ•™์Šต์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

์œ„์˜ (1)๋ฒˆ์—์„œ ์†Œ๊ฐœํ•œ 8.0=2.0*x์˜ ๋ฐฉ์ •์‹์—์„œ๋Š” ๋ณ€์ˆ˜ x-4.0์ด ๋ฉ๋‹ˆ๋‹ค. Tensorflow์˜ GradientTape()์™€ tape.gradient()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ฒ˜์Œ์— x=10.0์—์„œ train_func๋ฅผ 4ํšŒ ๋ฐ˜๋ณตํ•˜๋‹ˆ x=4.0์œผ๋กœ ๋‹ต์„ ์ž˜ ์ฐพ์•„๊ฐ”์Šต๋‹ˆ๋‹ค.

y=x2 ๋ผ๋Š” ํ•จ์ˆ˜์—์„œ (Target) y์— ๋Œ€ํ•œ (Source) x์˜ ๋ฏธ๋ถ„ (derivative of target y with respect to source x)์„ Tensorflow์˜ GradientTape.gradient() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ณ„์‚ฐํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ dydx=2โˆ—x๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 

 

์‚ฌ์šฉ ํ˜•์‹: GradientTape.gradient(target, source)

์œ„์˜ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ์—์„œ๋Š” ์Šค์นผ๋ผ(Scalar)๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด, tf.GradientTape()๋Š” ์–ด๋–ค ํ˜•ํƒœ์˜ ํ…์„œ์— ๋Œ€ํ•ด์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GradientTape.gradient(target, sources)์—์„œ sources์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๋ฆฌ์ŠคํŠธ๋‚˜ ์‚ฌ์ „ํ˜•(Dictionary)์˜ ํ˜•ํƒœ๋กœ ์ž…๋ ฅํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Targetr์— ๋Œ€ํ•œ Source์˜ ๋ฏธ๋ถ„ ๊ฒฐ๊ณผ๋Š” Source์˜ ํ˜•์ƒ(shape)์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๊ฐ€๋ น, ์œ„์˜ ์˜ˆ์—์„œ๋Š” ์†์‹คํ•จ์ˆ˜(Loss)์— ๋Œ€ํ•œ ๊ฐ€์ค‘์น˜(w)์˜ ๋ฏธ๋ถ„(derivative of loss with respect to weight)์˜ ๊ฒฐ๊ณผ๋Š” Source์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ€์ค‘์น˜(w)์˜ ํ˜•์ƒ์„ ๋”ฐ๋ผ์„œ (4, 2)๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. (ํ•ด๋‹น ์œ„์น˜์˜ ๊ฐ€์ค‘์น˜์— ๋Œ€ํ•ด์„œ ํŽธ๋ฏธ๋ถ„ํ•œ ๊ฒฐ๊ณผ)

2.1. 3. ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜์˜ ์ž๋™ ๋ฏธ๋ถ„ ์‹œ๊ฐํ™”(Auto-diff plot Sigmoid function)

๋”ฅ๋Ÿฌ๋‹์—์„œ ํ™œ์„ฑํ™” ํ•จ์ˆ˜ ์ค‘์˜ ํ•˜๋‚˜๋กœ ์‚ฌ์šฉ๋˜๋Š” S ๊ณก์„  ๋ชจ์–‘์˜ ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜(Sigmoid function)์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Sigmoid(x)=11+e(โˆ’x)=exex+1

์ด ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜๋ฅผ x์— ๋Œ€ํ•ด์„œ ๋ฏธ๋ถ„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Derivative of the Sigmoid function dS(x)dx=S(x)(1โˆ’S(x))

์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜์™€ ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜์˜ ๋ฏธ๋ถ„ ๊ฐ’์„ x๊ฐ€ -10.0์—์„œ 10.0 ์‚ฌ์ด์˜ 200๊ฐœ์˜ ๊ด€์ธก์น˜์— ๋Œ€ํ•ด Tensorflow์˜ tf.GradientTape()์™€ GradientTape=tape.gradient(Sigmoid_func, x)๋กœ ๊ณ„์‚ฐํ•ด์„œ ํ•˜๋‚˜์˜ ๊ทธ๋ž˜ํ”„์— ๊ฒน์ณ์„œ ์‹œ๊ฐํ™”๋ฅผ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ์ฝ”๋“œ์—์„œ ์ฃผ์š”ํ•œ ์—ญํ• ์€ tape.watch(x)๊ฐ€ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ GradientTape ๋‚ด์—์„œ ํŠน์ • ๋ณ€์ˆ˜์˜ ์—ฐ์‚ฐ์„ "๊ฐ์‹œ"ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•ด๋‹น ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ชจ๋“  ์ค‘๊ฐ„ ์—ฐ์‚ฐ์„ ๋ ˆ์ฝ”๋”ฉํ•˜๊ณ , ๋‚˜์ค‘์— ๊ทธ๋ž˜๋””์–ธํŠธ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ์ฃผ์–ด์ง„ ์ฝ”๋“œ์—๋Š” 'x'๋ฅผ tape.watch(x)๋กœ ๊ฐ์‹œํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ดํ›„์— 'y=tf.nn.sigmoid(x)'์™€ ๊ฐ™์€ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ์ค‘๊ฐ„ ์—ฐ์‚ฐ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ tape.gradient(y, x)๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ 'y'์— ๋Œ€ํ•œ 'x'์˜ ๊ทธ๋ž˜๋””์–ธํŠธ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

 

2.2. 4. ํ…Œ์ดํ”„๊ฐ€ "๋ณผ(์ €์žฅ)"๊ฒƒ์„ ์กฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•(Controlling what the tape "watches")

Tensorflow๊ฐ€ ์˜ค์ฐจ์—ญ์ „ํŒŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ•™์Šต(training by backpropagation algorithm)ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ž๋™๋ฏธ๋ถ„์€ 'ํ•™์Šต ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜ (trainable tf.Variable)'์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. 

 

๋”ฐ๋ผ์„œ ๋งŒ์•ฝ (1) ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ์ƒ์ˆ˜ ('tf.Tensor')๋ผ๋ฉด Tensorflow๊ฐ€ ์•ˆ ๋ณด๋Š” (not watched), ์ฆ‰ ๊ธฐ๋กํ•˜์ง€ ์•Š๋Š” (not recorded)๊ฒƒ์ด ๊ธฐ๋ณธ ์„ค์ •์ด๋ฏ€๋กœ ์ž๋™ ๋ฏธ๋ถ„์„ ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, (2) ๋ณ€์ˆ˜(tf.Variable)๋”๋ผ๋„ 'ํ•™์Šต ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์œผ๋ฉด (not trainable)' ์ž๋™ ๋ฏธ๋ถ„์„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

y์— ๋Œ€ํ•œ tf.Tensor์ธ x์˜ ๋ฏธ๋ถ„์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” GradientTape.watch(x)๋ฅผ ํ˜ธ์ถœํ•ด์„œ tf.Tensor์ธ x๋ฅผ ํ…Œ์ดํ”„์— ๊ธฐ๋กํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ Tensorflow์˜ ํ…Œ์ดํ”„์— ๊ธฐ๋ก๋˜๋Š” 'ํ•™์Šต ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜'๋Š” GradientTape.watched_variables() ๋ฉ”์„œ๋“œ๋กœ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

ํ•ด๋‹น ์ฝ”๋“œ๋Š” ์œ„์˜ ์ฝ”๋“œ๋ฅผ ํ™•์ธ ํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์œ„์˜ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์•„๋ฌด ๊ฐ’๋„ ๋‚˜์˜ค์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ ์ด์œ ๋Š” x๋ฅผ tf.constant๋กœ ์„ ์–ธํ•œ ๋ถ€๋ถ„์— ์žˆ์Šต๋‹ˆ๋‹ค. constant๋Š” ์ƒ์ˆ˜๋กœ์จ ๋ณ€ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

๋ฐ˜๋Œ€๋กœ, ๋ชจ๋“  ๋ณ€์ˆ˜ (tf.Variable)๋ฅผ ํ…Œ์ดํ”„์— ๊ธฐ๋กํ•˜๋Š” Tensorflow์˜ ๊ธฐ๋ณธ์„ค์ •์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด watch_accessed_variables=False๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

 

์•„๋ž˜์˜ ์˜ˆ์‹œ์—์„œ๋Š” x0, x1 ๋‘ ๊ฐœ์˜ tf.Variable ๋ชจ๋‘๋ฅผ watch_accessed_variables=False๋กœ ๋น„ํ™œ์„ฑํ™”ํ•ด๋†“๊ณ , GradientTape.watch(x1)๋กœ x1๋ณ€์ˆ˜๋งŒ ํ…Œ์ดํ”„์— ๊ธฐ๋กํ•ด์„œ ์ž๋™ ๋ฏธ๋ถ„์„ ํ•ฉ๋‹ˆ๋‹ค.

2.3. 5. Python ์กฐ๊ฑด์ ˆ์„ ์‚ฌ์šฉํ•œ ํ…Œ์ดํ”„ ๊ธฐ๋ก ํ๋ฆ„์„ ์กฐ์ •

Python์˜ ์กฐ๊ฑด์ ˆ์„ ์ด์šฉํ•œ ๋ถ„๊ธฐ๋ฌธ์„ ์ด์šฉํ•˜๋ฉด Tensorflo์˜ tf.GradientTape() ๋งฅ๋ฝ ์•„๋ž˜์—์„œ ํ…Œ์ดํ”„์— ๊ธฐ๋กํ•˜๋Š” ์—ฐ์‚ฐ ๊ณผ์ •์„ ํ๋ฆ„์„ ์กฐ๊ฑด์ ˆ์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ๋งŒ ์ทจ์‚ฌ์„ ํƒ์—์„œ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์•„๋ž˜์˜ ์˜ˆ์‹œ์—์„œ๋Š” if x > 0.0์ผ ๋•Œ๋Š” result=v0, ๊ทธ๋ ‡์ง€ ์•Š์„ ๋•Œ(else)๋Š” result=v1**2๋กœ result์˜ ์—ฐ์‚ฐ์„ ๋‹ค๋ฅด๊ฒŒ ํ•ด์„œ ํ…Œ์ดํ”„์— ๊ธฐ๋กํ•˜๊ณ , GradientTape.gradient()๋กœ ์ž๋™๋ฏธ๋ถ„ํ•  ๋•Œ๋Š” ์•ž์„œ if else ์—์„œ True์— ํ•ด๋‹น๋˜์–ด ์‹ค์ œ ์—ฐ์‚ฐ์ด ์ผ์–ด๋‚ฌ๋˜ ๋ฏธ๋ถ„์„ ์—ฐ๊ฒฐํ•ด์„œ ๊ณ„์‚ฐํ•˜๋ผ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ x=tf.constant(1.0)์œผ๋กœ์จ if x > 0.0 ์กฐ๊ฑด์ ˆ์„ ๋งŒ์กฑ(True)์‹œ์ผฐ์œผ๋ฏ€๋กœ result=v0 ์—ฐ์‚ฐ์ด ์‹คํ–‰๋˜๊ณ  ๋’ค์— tape.gradient()์—์„œ ์ž๋™๋ฏธ๋ถ„์ด ๋˜์—ˆ์œผ๋ฉฐ, else ์กฐ๊ฑด์ ˆ ์•„๋ž˜์˜ ์—ฐ์‚ฐ์„ ์‹คํ–‰๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋’ค์˜ tape.gradient()์˜ ์ž๋™๋ฏธ๋ถ„์€ ํ•ด๋‹น๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

 

 

'๐Ÿ–ฅ๏ธ Computer Vision' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

TIF ํŒŒ์ผ์ด๋ž€?  (0) 2023.06.25
profile

MewwSikk

@Mu Gyum

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!