Bangalore FP June 2026 meetup
Reminder: we have the #Bangalore #FPIndia #meetup this Saturday at Pre6! We have two planned talks -
1. Abhinav will talk about type level programming in #Haskell
2. Srijan will talk about #MachineLearning in pure languages, specifically with #HaskTorch
Hasktorch lร thฦฐ viแปn liรชn kแบฟt Haskell cho LibTorch, giรบp phรกt triแปn hแปc sรขu (deep learning) hiแปu quแบฃ. Nรณ sแปญ dแปฅng FFI ฤแป kแบฟt nแปi, mang lแบกi sแปฉc mแบกnh cแปงa LibTorch vร o mรดi trฦฐแปng Haskell.
#Hasktorch #Haskell #LibTorch #DeepLearning #AI #KhoaHocDuLieu #HocSau
https://www.reddit.com/r/programming/comments/1pbfba1/hasktorch_libtorch_haskell_bindings_for_deep/
Hasktorch lร thฦฐ viแปn mแปi mang LibTorch (core cแปงa PyTorch) ฤแบฟn vแปi Haskell thรดng qua FFI, mแป ra cฦก hแปi phรกt triแปn แปฉng dแปฅng hแปc sรขu mแบกnh mแบฝ bแบฑng ngรดn ngแปฏ functional nร y. Khรกm phรก Deep Learning trรชn Haskell!
#Hasktorch #Haskell #DeepLearning #LibTorch #FFI #Programming #HocSau #LapTrinh #ThuVien
https://www.reddit.com/r/programming/comments/1pbfba1/hasktorch_libtorch_haskell_bindings_for_deep/
๊ฑฐ๊พธ๋ก ์ํ ๋ชจ๋๋๋ก ๊ฐํ ํ์ต ํ๊ธฐ (1/2)
https://hackers.pub/@bgl/2025/reverse-state-monad-for-reinforcement-learning
๊ธฐ๊ณ ํ์ต์ ์ ํ ๋ชจ๋ฅด๊ณ ์ด๋ฉด ์ ๋๊ฒ ๋ค ์ถ์ด, ์ผ๋ง์ ๋ถํฐ ํ์ค์ผ๋ก ๊ณต๋ถํ๊ธฐ ์์ํ๋ค. Hasktorch๋ผ๊ณ ํ์ค์ผ์ฉ Torch ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ๋ค. ์ด์ ์ ๋์ ํ์๋ MNIST๊น์ง ํ๊ณ ๋ค์์ ๋ญ ํด์ผํ ์ง ๋ชจ๋ฅด๊ฒ ์ด์ ๊ทธ๋ง๋๋๋ฐ, ์ด๋ฒ์ ๊ฐํ ํ์ต์ผ๋ก ์ด์ด๋๊ฐ ๋ณด๊ธฐ๋ก ํ๋ค. ๊ฐํ ํ์ต์ ์ฃผ์ด์ง ํ๊ฒฝ์์ ๋ณด์์ ์ต๋ํํ๋ ์์ด์ ํธ๋ฅผ ํ์ต์ํค๋ ๊ฒ์ผ๋ก, ๋ฐ์ดํฐ๊ฐ ํ์์๋ค๋๊ฒ ์ฅ์ ์ด๋ค. ๋์ ํ๊ฒฝ์ ๋ง๋ค์ด์ผ ํ๋๋ฐ, ๊ฐ๋จํ ๊ฒ์๋ ํ๊ฒฝ์ด ๋ ์ ์๋ค. ๊ฒ์ ๋ง๋ค๊ธฐ๋ ๋ฐ์ดํฐ ๋ชจ์ผ๊ธฐ์ ๋ฌ๋ฆฌ ์ฆ๊ฑฐ์ด ์ผ์ด๋ ๋ง๋คํ ํ์๊ฐ ์๋ค. ์ฒซ๋ฒ์งธ๋ก ๋์ ์ผ๋ก ์ค๋ค์ดํฌ ๊ฒ์์ ๊ณจ๋๋๋ฐ, ๋ค๋ค ํ๋ฒ์ฏค์ ํด๋ดค์ ๊ฒ์ด๋ค. ๋ฑ์ ์กฐ์ข ํด ๋จน์ด๋ฅผ ์ต๋ํ ๋ง์ด ๋จน์ผ๋ฉด ๋๋๋ฐ, ๋ฑ์ ๋จธ๋ฆฌ๊ฐ ๋ฒฝ์ด๋ ์๋๋ฉด ์๊ธฐ ๋ชธํต์ ๋ถ๋ชํ๋ฉด ์ฃฝ๋๋ค. ์ฌ์ฐจ์ฌ์ฐจ ํ์ต์์ผ์ ์ด์ ๋๊น์ง ํ๋๋ฐ์๋ ์ฑ๊ณตํ๋ค. ๊ฐํ ํ์ต ์ง์์ด ์ผ์ฒํด์ ๊ฒ์์ ํด๋ฆฌ์ดํ๋ ์์ค๊น์ง๋ ๋ชป ๋ง๋ค๊ฒ ๋ค. ์ด ๊ธ์ ํ์ต์ ์ ์ํค๋ ๋ฐฉ๋ฒ์ด ์๋๋ผ, ๊ฐํํ์ต ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์ ์ง๋๋์ ๋ํ ๊ฒ์ด๋ค.<์ผ๋จ ๊ฐํ ํ์ต์ด๋๊ฑธ ํ์ํ ํด๋ณด์. ์์ ์ธ๊ธํ ํ๊ฒฝ๊ณผ ์์ด์ ํธ๋ ๋จ์ด๋ฅผ ์ด๋ป๊ฒ ์ ์ํ ์ ์์๊น? ๋จผ์ ์์ด์ ํธ์ ์ ์๋ ์ด๋ ๋ค.type Agent = Observation -> Action<๊ด์ธก Observation ์ ๋ฐ๋ผ ํ๋ Action ์ ์ ํํ๋ค. ๋๋ ๋์์ ์ฝ๋ผ๊ฐ ๋ณด์ด๋ฉด ๋ง์ ๋ค. ํ๊ฒฝ์ ์์ด์ ํธ๋ฅผ ์คํํ๋ ๋ฌด์ธ๊ฐ์ด๋ค. ์ผ์์ ์ธ ํํ์ผ๋ก ์ฐ์๋ฉด, ์์ด์ ํธ๋ฅผ ๋๋ฌ์ผ ๋ฌด์ธ๊ฐ์ด๋ค.runAgent :: Agent -> [Action]<์ด runAgent ํจ์๊ฐ ํ๊ฒฝ์ ์ญํ ์ ์ํํ๋ค. Agent๋ฅผ ์ธ์๋ก ๋ฐ์ ์ฃฝ์ ๋๊น์ง ์ ํํ ํ๋๋ค์ ๋ฐํํ๋ค. ๊ทธ๋ฐ๋ฐ ์ด๊ฑด ๋๋ฌด ์ธ์ฐ์ ์ธ ์ ์๊ณ , ํ๊ฒฝ๊ณผ ์์ด์ ํธ๊ฐ ๋ณดํต ๋ง์กฑํ ๋งํ ์กฐ๊ฑด์ ๋์ดํด๋ณด์๋ฉด ์ด๋ ๋ค.ํ๊ฒฝ์ ์ํ๋ฅผ ๊ฐ์ง๊ณ ์๊ณ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋๋ค์ํ๋ ์์ด์ ํธ๊ฐ ๋ฌด์์ ๊ด์ธกํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ค์์ด์ ํธ์ ํ๋์ ๋ค์ ์ํ์ ์ํฅ์ ๋ผ์น๋ค<์ด ์กฐ๊ฑด๋ค์ ๋ฐํ์ผ๋ก ํ๊ฒฝ์ ์ข๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ ์ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.class Environment e where type State e type Observation e type Action e update :: (State e, Action e) -> State e -- ์กฐ๊ฑด 1, 3 observe :: State e -> Observation e -- ์กฐ๊ฑด 2<์ค๋ค์ดํฌ ๊ฒ์์์ ์ํ๋ ๋ฑ์ ๋ชจ์๊ณผ ๋จน์ด์ ์์น, ๊ด์ธก์ ์ํ์ ๊ฐ๊ณ (ํ๋ ์ด์ด๋ ์ ์ฒด ๊ฒ์ ํ๋ฉด์ ๋ณผ ์ ์๋ค), ํ๋์ ์ขํ์ ๊ณผ ์ฐํ์ ์ด ๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ฑ์ด ์๋ฌด๋ ๊ฒ๋ ์ขํ์ ์ฐํ์ ํ๋ค๊ณ ๋ฐ์ ์ณ์ค์ ์๊ณ , ์ฐ๋ฆฌ๋ ์ํํ ๋ฐ๋ผ๋ ๊ฒ ์๋ค. ์ฃฝ์ง์๊ณ ๋ ๋ง์ ๋จน์ด๋ฅผ ๋จน์ด์ผ ํ๋ค. ์ด๋ฅผ ์ํด ๋ฑ์ด ์ ๋ ๋ฐฉํฅ์ ๋ฐ๊ฟ์ ๋จน์ด๋ฅผ ์ง๋์น์ง ์๊ณ ๋จน์ผ๋ฉด ์ ํ๋ค๊ณ ๋ณด์์ ์ฃผ์. ๊ทธ๋ฌ๋ฉด ๋ฑ์ ๋ณด์์ ๋ ๋ง์ด ๋ฐ์ ๋ฐฉ๋ฒ์ ํ์ตํ๋ค.type RewardFunction = (Observation, Action) -> Float<๋ณด์ ํจ์๋ ๊ด์ธก์ ํ๋์ ๋ฐ๋ผ ๋ณด์์ ๊ฒฐ์ ํ๋ค. ๊ฐ๋ น ๋ฑ์ด ๋จน์ด ํ๋๋ฅผ ๋ ๋ ํ๋ฉด ๋ณด์์ 1 ์ฃผ๋ฉด ๋๋ค. ์ง๋์ณ๋ฒ๋ฆฌ๋ฉด 0์ ์ด๊ณ , ์ฃฝ์์ ๋๋ -1์ ์ ์ค ์๋ ์๋ค. ๋น๊ทผ๊ณผ ์ฑ์ฐ์ด๋ผ ์๊ฐํ๊ณ ์ ์ํ๋ฉด ๋๋ค. ๋, ๋ณด์์ ๋ํด์ ๋์ ์ด ๋์ด์ผ ํ๋ฏ๋ก ๋์ถฉ Float์ผ๋ก ๊ณ ๋ฅธ๋ค. ํ์ต์ ์ํค๋ ค๋ฉด ๋ณด์์ ๊ณ์ฐํด์ผํ๊ณ , ๊ทธ๋ฌ๊ธฐ ์ํด ๊ด์ธก๊ณผ ํ๋์ ์ง์ง์ด์ผํ๋ค.trainAgent :: Agent -> [(Observation, Action)]<runAgent์ ๋ฌ๋ฆฌ Observation๋ ํฌํจ๋์ด ์๋ค. ์ด๋ [(Observation, Action)]์ ์ํผ์๋ Episode ๋ผ๊ณ ํ๋ค. ์ํผ์๋๋ก๋ถํฐ ๋ณด์์ ๊ตฌํ์.rewards = fmap (uncurry rewardFn) (trainAgent agent)rewardFn :: RewardFunctionagent :: Agent<...ํด์น์ ๋? ์ํผ์๋๊ฐ ์ด๋ป๊ฒ ๊ธฐ๋ก๋ ์ง๋ฅผ ์ดํด๋ณด์.0123456789ํ๋โโโโโโโโโโ๋ณด์๐๐๐๐<์์ rewards์ ๊ฐ์ด ์ด๋ฐ ์๋ฏธ์ผ๊ฑฐ๋ผ๊ณ ๋ณด์ธ๋ค. ์ค์ ๋ก Float ๊ฐ์ ํ์ํด๋ณด์.0123456789ํ๋โโโโโโโโโโ๋ณด์0010011000<ํน์ ์ด์ํ ๊ฑธ ์ฐพ์ผ์ จ๋์? ์ด๋ฐ์์ผ๋ก ๋ณด์ํ๋๊ฒ ํ๋ฆฐ ๊ฑด ์๋๋ค. ๋ค๋ง ์์ด์ ํธ๊ฐ ์ฅ๊ธฐ์ ์ธ ๊ณํ์ ์ธ์ฐ๋๋ก ํ์ต์ํค์ง ๋ชปํ๋ค. ๋จน์ด๋ฅผ ๋จน๋ ์๊ฐ์๋ง ๋ณด์์ ๋ฐ๊ธฐ ๋๋ฌธ์, ๋ฉ๋ฆฌ ๋จ์ด์ง ๋จน์ด๋ฅผ ํฅํด ๋ค๊ฐ๊ฐ๊ฒ๋ ์ ๋ํ ์๊ฐ ์๋ค. ์ด๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ณด์์ ๋ค์์๋ถํฐ ๋์ ์์ผ์ผ ํ๋ค.0123456789ํ๋โโโโโโโโโโ๋ณด์3332221000rewards = scanr (+) 0 (fmap (uncurry rewardFn) (trainAgent agent))<์ฝ๋ฉ ํ ์คํธ์ฉ ์ฝ๋๋ฅผ ์ง์ผํ ๊ฒ ๊ฐ์ ๋๋์ด ๋ค์๋๋ฐ, ๋คํํ scanr ํจ์ ๋๋ถ์ ์ฝ๊ฒ ํด๊ฒฐํ๋ค. ์ข๋ ๊ฐ์ ํด๋ณผ๊น. ์ง๊ธ์ ๋ณด์ ์ฒด๊ณ์์ ์์ด์ ํธ๋ ๋จผ ๋ฏธ๋๋ฅผ ๊ณ ๋ คํ๋ฉฐ ์ ํํ๋ ๊ฒ์ ๋ฐฐ์ธ ์ ์๋ค. ๊ทธ๋ฐ๋ฐ, ์ฌ์ค ๋ฑ์ด ๋งจ ์ฒ์์ ์ขํ์ ์ ํ๋ ์ฐํ์ ์ ํ๋, ์ฃฝ๊ธฐ ์ ๊น์ง ๋จน์ด๋ฅผ ์ด ๋ช๊ฐ ๋จน๋์ง์ ์์ฒญ๋ ์ํฅ์ ๋ผ์น ๊ฑฐ ๊ฐ์ง ์๋ค. ์ด๋ค ์์ ์์์ ์ ํ์ ์ํฅ์ ์๊ฐ์ด ์ง๋ ์๋ก ์ ์ ํฌ๋ฏธํด์ง๋ค. ์ด ์ ์ ๋ฐ์ํด์ ๋ฑ์ด ์๋ชป๋ ํธ๊ฒฌ์ ๊ฐ์ง ์๋๋ก ๋์์ฃผ์. ๋ฏธ๋์ ๋ณด์์ ๋์ ํ๋, ๊ฐ์ ์จ 0.9๋ฅผ ์ ์ฉํ๋ ๊ฒ์ด๋ค.0123456789ํ๋โโโโโโโโโโ๋ณด์1.932.152.391.541.711.901.000.000.000.00rewards = scanr (\x y -> x + 0.9 * y) 0 (fmap (uncurry rewardFn) (trainAgent agent))<์ด์ ๋๋จธ์ง๋ GPUํํ ๋งก๊ธฐ๋ฉด ๋๋ค. ์กฐ๊ธ๋ง ๊ธฐ๋ค๋ฆฌ๋ฉด ์์ ๋์์์์์ฒ๋ผ ์์ง์ด๋ ๋ฑ์ ๋ณผ ์ ์๋ค.<์ฌ๊ธฐ์ GPU๋ฅผ 100์ฅ ๋ ์ฌ์ ๋ฑ ๋์ ์ ์ข๋ ์ฐ๋ฆฌ ์ถ์ ๋์๋๋ ์์ด์ ํธ๋ฅผ ํ์ต์ํจ๋ค๋ฉด, ๊ทธ๊ฑธ 10๋ ์ ์ ํ์ผ๋ฉด, ๋ ์ง๊ธ ๋ถ์๊ฐ ๋์ด์์์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค. ํ์ง๋ง ๊ธฐํ๋ ์ด๋ฏธ ๋ ๋ฌ๊ณ , ๋ ์ง๊ธ ๋์ ์์ง๋ง ๋์ ์๊ฐ์ ๋ง๋ค. ๊ทธ ์๊ฐ์, ์ง๊ธ์ ๊ทธ๋ญ์ ๋ญ ๋ณผ๋งํ ์ฝ๋๋ฅผ ์ฅ๊ผฌ๋ฆฌ๋งํผ ๊ฐ์ ํ๋๋ฐ ๋ญ๋นํด๋ณด๋ ค ํ๋ค. ์ง๊ธ ์ฝ๋์์ ๋ญ๊ฐ ๋ง์์ ์๋๋๋ฉด,<๋ณด์์ด ์ฌ์ค ์๋ก ๋ค๋ฅธ ๋ ๊ฐ๋ฅผ ๊ฐ๋ฆฌํจ๋ค ๋จน์ด๋ฅผ ๋จน์๋ง์ ์ฆ๊ฐ์ ์ผ๋ก ์ฃผ๋ ๋ณด์๊ณผ, ๊ทธ๊ฒ์ ๋์ ํ ๋ณด์, ์ด๋ ๊ฒ ๋ ๊ฐ๊ฐ ์๋ค. ์ค์ ๋ก ํ์ต์ ์ฌ์ฉํ๋ ๊ฒ์ ํ์์ด๋ค. ๊ทธ๋ฐ๋ฐ ๋ง์ ๋ณด์ ํจ์์ ์ ์๋ ์ ์์ ๋ํ ๊ฒ์ด๋ค. ์ด๋ ๋ณด์ ํจ์๋ฅผ ๊ณ์ฐํ ๋ ๋ฏธ๋์ ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง ์์๊ฐ ์์ด์ ๊ทธ๋ ๋ค. ์ ์๋ฅผ ๋ ๊ฐ๋ก ๋๋ ์ด์ ๊ฐ ์๋ฏธ๋ฅผ ๋ช ์พํ๊ฒ ํ๊ธฐ ์ํด์๊ฐ ์๋๋ผ, ๊ทธ๋ฅ ํ๋ฒ์ ๊ณ์ฐ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.<ํ๊ฒฝ์ ์ ์ ์์์ ์ดํด๋ณธ runAgent์ ์ ์๊ฐ ์ผ๊ฒฌ ์ฐ์ํด๋ณด์ผ ์ ์๋ค. ๋ฌธ์ ๋ ๊ทธ ์ ์๋ ํ๊ฒฝ๊ณผ ์์ด์ ํธ๊ฐ ๋ชจ๋ ์์ ํจ์์ผ ๊ฒ์ ๊ฐ์ํ๋ค๋ ๊ฒ์ด๋ค. Environment์ ์ ์๋ ๋ง์ฐฌ๊ฐ์ง๋ค. ํ๊ฒฝ๊ณผ ์์ด์ ํธ๋ ๊ฐ์์ ๋ถ์ํจ๊ณผ Side effect ๋ฅผ ๊ฐ์ง ์ ์์ด์ผ ํ๋ค. ๊ฐ๋ น ์จ๋ผ์ธ ๊ฒ์์ ํ๊ฒฝ์ผ๋ก ์ผ๋๋ค๋ฉด, ํ๊ฒฝ์ ๋คํธ์ํน์ ํ ์ ์์ด์ผ ํ๋ค. ๋, ์์ด์ ํธ๋ ๋งค๋ฒ ๋๊ฐ์ ์ ํ์ด ์๋ ํ๋ฅ ์ ์ ํ์ ํ๊ณ ์ถ์ํ ๋ฐ, ์ด๋ ์์ ํจ์๋ก์จ๋ ๋ถ๊ฐ๋ฅํ๋ค.<๊ทธ๋ฌ๋ฉด ๋ถ์ํจ๊ณผ๋ฅผ ํ์ฉํ๋ฉด ๋๋๊ฑฐ ์๋?<๋ง๋ค. ๋์ฒ๋ผ ์๊ฐ์ด ๋ง๋ค๋ฉด ์ง์ ํด๋ณด๋ ๊ฒ๋ ๋์์ง ์๋ค. ํ์ง๋ง ์ ์๊ฐ ์ ์ ์ง์ ๋ถํด์ง๋ ๊ฒ์ ๋ณด๊ฒ๋ ๊ฒ์ด๊ณ ... ์๊ฐ์ ์๊ปด์ฃผ๊ธฐ ์ํด ์ ๋ต์ ์๋ ค์ฃผ๊ฒ ๋ค. ํ๊ฒฝ์ ์์ด์ ํธ๊ฐ ์คํ๋ ์ ์๋ ๋ชจ๋๋์ฌ์ผ ํ๋ค. ๋ฑ ๊ฑฐ๊ธฐ๊น์ง์ฌ์ผ ํ๋ค. ํ๊ฒฝ๊ณผ ์์ด์ ํธ ์ฌ์ด์ ๊ทธ ์ด์์ ๊ด๊ณ๋ ๋ถ์ ์ ํ๋ค.<๊ธ์ด ์๊ฐํ๋ ๊ฒ๋ณด๋ค ๊ธธ์ด์ ธ๋ฒ๋ ค์, ์ค๋์ ์ฌ๊ธฐ๊น์ง ํด์ผ๊ฒ ๋ค. ์ด์ด์ง๋ ๊ธ์์ ๊ฑฐ๊พธ๋ก ์ํ ๋ชจ๋๋๊ฐ ์ด๊ฑธ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ์๊ฐํ๋ค. ์ฌ์ค ์๊น ํ๊ฒฝ์ด๋ ์์ด์ ํธ๋ ์ด์ฉ๊ณ ํ ๋๋ถํฐ, ์ง์์ ๊ฐํ ํ์ต์ ๋ง์คํฐํ ํ์๋ค์ด ์ด๋ฏธ ๋ค ์๋ ๋ด์ฉ์ ์ง๊ฒจ์ ์กธ๊ธฐ ์์ํ๋๊ฒ ๋ณด์๋ค. ๋ค์ ์์ ์ ์ฌ๋ฐ์ํ ๋, ๋์ ๊ทธ๋๊น์ง ๋ชจ๋๋๋ฅผ ๋ฐฐ์์ค์ธ์.