What is Hackers' Pub?

Hackers' Pub is a place for software engineers to share their knowledge and experience with each other. It's also an ActivityPub-enabled social network, so you can follow your favorite hackers in the fediverse and get their latest posts in your feed.

0
0
0
0
0
0

原來這種就叫Valley girl

大家都說短影音對小朋友的禍害,但放在我伴侶外甥女的情況
他因為看太多外國短影音,已經被洗成一個ABC了,明明家裡大家英語水平都普普…

我覺得他英文詞彙量和會的文法已經直逼本地初中生了,還被老師叫去當股長
但與此同時中文/粵語水平卻比同齡孩子落後,很多東西只知道英文怎麼說不知道中文怎麼說

真的不知道好氣還是好笑

0
0
0
0
0
0
0
0
0
0

한국 연합우주 개발자 모임(FediDev KR)은 이름 그대로 한국에서 연합우주(fediverse)와 관계된 개발(프로그래밍 뿐만 아니라 문서화, 번역 등을 포함)을 하는 사람들의 모임입니다. 실제로 Hackers' Pub의 개발 논의도 이 모임에서 처음 나왔었고요. Hackers' Pub을 통해서 ActivityPub이나 연합우주에 관심이 생기셨다면 한 번 참여해 보셔도 좋을 것 같습니다.

참고로 올해에는 아직 개최한 적 없지만 비정기적으로 스프린트 모임도 하고 있습니다. @sprints.fedidev.kr한국 페디버스 개발자 모임 계정을 팔로하시면 스프린트 모임이 열리기 전에 미리 공지를 올릴테니 미리 확인하실 수 있을 거예요.

0

Juntai Park shared the below article:

거꾸로 상태 모나드로 강화 학습 하기 (1/2)

bgl gwyng @bgl@hackers.pub

기계 학습을 전혀 모르고 살면 안 되겠다 싶어, 얼마전부터 하스켈로 공부하기 시작했다.

Hasktorch라고 하스켈용 Torch 바인딩을 사용한다. 이전에 도전했을땐 MNIST까지 하고 다음에 뭘 해야할지 모르겠어서 그만뒀는데, 이번엔 강화 학습으로 이어나가 보기로 했다.

강화 학습은 주어진 환경에서 보상을 최대화하는 에이전트를 학습시키는 것으로, 데이터가 필요없다는게 장점이다. 대신 환경을 만들어야 하는데, 간단한 게임도 환경이 될 수 있다. 게임 만들기는 데이터 모으기와 달리 즐거운 일이니 마다할 필요가 없다.

첫번째로 도전으로 스네이크 게임을 골랐는데, 다들 한번쯤은 해봤을 것이다. 뱀을 조종해 먹이를 최대한 많이 먹으면 되는데, 뱀의 머리가 벽이나 아니면 자기 몸통에 부딪히면 죽는다.

여차여차 학습시켜서 이정도까지 하는데에는 성공했다.

강화 학습 지식이 일천해서 게임을 클리어하는 수준까지는 못 만들겠다. 이 글은 학습을 잘 시키는 방법이 아니라, 강화학습 코드를 어떻게 잘 짜느냐에 대한 것이다.


일단 강화 학습이란걸 형식화 해보자. 앞서 언급한 환경과 에이전트란 단어를 어떻게 정의할수 있을까?

먼저 에이전트의 정의는 이렇다.

type Agent = Observation -> Action

관측 Observation 에 따라 행동 Action 을 선택한다. 나는 눈앞에 콜라가 보이면 마신다.

환경은 에이전트를 실행하는 무언가이다. 일상적인 표현으로 쓰자면, 에이전트를 둘러싼 무언가이다.

runAgent :: Agent -> [Action]

runAgent 함수가 환경의 역할을 수행한다. Agent를 인자로 받아 죽을 때까지 선택한 행동들을 반환한다.

그런데 이건 너무 외연적인 정의고, 환경과 에이전트가 보통 만족할만한 조건을 나열해보자면 이렇다.

  1. 환경은 상태를 가지고 있고 시간이 지남에 따라 변경된다
  2. 상태는 에이전트가 무엇을 관측할지를 결정한다
  3. 에이전트의 행동은 다음 상태에 영향을 끼친다

이 조건들을 바탕으로 환경을 좀더 구체적으로 정의하면 다음과 같다.

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 :: RewardFunction
agent :: Agent

...해치웠나?

에피소드가 어떻게 기록될지를 살펴보자.

0 1 2 3 4 5 6 7 8 9
행동
보상 🍎 🍎 🍎 💀

위의 rewards의 값이 이런 의미일거라고 보인다. 실제로 Float 값을 표시해보자.

0 1 2 3 4 5 6 7 8 9
행동
보상 0 0 1 0 0 1 1 0 0 0

혹시 이상한 걸 찾으셨나요?

이런식으로 보상하는게 틀린 건 아니다. 다만 에이전트가 장기적인 계획을 세우도록 학습시키지 못한다. 먹이를 먹는 순간에만 보상을 받기 때문에, 멀리 떨어진 먹이를 향해 다가가게끔 유도할 수가 없다. 이를 해결하려면 보상을 뒤에서부터 누적시켜야 한다.

0 1 2 3 4 5 6 7 8 9
행동
보상 3 3 3 2 2 2 1 0 0 0
rewards = scanr (+) 0 (fmap (uncurry rewardFn) (trainAgent agent))

코딩 테스트용 코드를 짜야할것 같은 느낌이 들었는데, 다행히 scanr 함수 덕분에 쉽게 해결했다.

좀더 개선해볼까.

지금의 보상 체계에서 에이전트는 먼 미래를 고려하며 선택하는 것을 배울 수 있다. 그런데, 사실 뱀이 맨 처음에 좌회전을 하던 우회전을 하던, 죽기 전까지 먹이를 총 몇개 먹는지에 엄청난 영향을 끼칠거 같진 않다. 어떤 시점에서의 선택의 영향은 시간이 지날 수록 점점 희미해진다. 이 점을 반영해서 뱀이 잘못된 편견을 갖지 않도록 도와주자. 미래의 보상을 누적하되, 감쇠율 0.9를 적용하는 것이다.

0 1 2 3 4 5 6 7 8 9
행동
보상 1.93 2.15 2.39 1.54 1.71 1.90 1.00 0.00 0.00 0.00
rewards = scanr (\x y -> x + 0.9 * y) 0 (fmap (uncurry rewardFn) (trainAgent agent))

이제 나머지는 GPU한테 맡기면 된다. 조금만 기다리면 위의 동영상에서처럼 움직이는 뱀을 볼 수 있다.


여기서 GPU를 100장 더 사서 뱀 대신에 좀더 우리 삶에 도움되는 에이전트를 학습시킨다면, 그걸 10년전에 했으면, 난 지금 부자가 되어있을지도 모르겠다. 하지만 기회는 이미 떠났고, 난 지금 돈은 없지만 대신 시간은 많다. 그 시간을, 지금의 그럭저럭 볼만한 코드를 쥐꼬리만큼 개선하는데 낭비해보려 한다.

지금 코드에서 뭐가 마음에 안드냐면,

  • 보상이 사실 서로 다른 두 개를 가리킨다

    먹이를 먹자마자 즉각적으로 주는 보상과, 그것을 누적한 보상, 이렇게 두 개가 있다. 실제로 학습에 사용하는 것은 후자이다. 그런데 막상 보상 함수의 정의는 전자에 대한 것이다. 이는 보상 함수를 계산할 때 미래에 어떤 일이 일어나는지 알수가 없어서 그렇다. 정의를 두 개로 나눈 이유가 의미를 명쾌하게 하기 위해서가 아니라, 그냥 한번에 계산을 할수 없기 때문이다.

  • 환경의 정의

    위에서 살펴본 runAgent의 정의가 일견 우아해보일 수 있다. 문제는 그 정의는 환경과 에이전트가 모두 순수 함수일 것을 강요한다는 것이다. Environment의 정의도 마찬가지다.

    환경과 에이전트는 각자의 부수효과 Side effect 를 가질 수 있어야 한다. 가령 온라인 게임을 환경으로 삼는다면, 환경은 네트워킹을 할 수 있어야 한다. 또, 에이전트는 매번 똑같은 선택이 아닌 확률적 선택을 하고 싶을텐데, 이는 순수 함수로써는 불가능하다.

    그러면 부수효과를 허용하면 되는거 아냐?

    맞다. 나처럼 시간이 많다면 직접 해보는 것도 나쁘지 않다. 하지만 정의가 점점 지저분해지는 것을 보게될 것이고...

    시간을 아껴주기 위해 정답을 알려주겠다. 환경은 에이전트가 실행될 수 있는 모나드여야 한다. 딱 거기까지여야 한다. 환경과 에이전트 사이에 그 이상의 관계는 부적절하다.

글이 생각했던 것보다 길어져버려서, 오늘은 여기까지 해야겠다. 이어지는 글에서 거꾸로 상태 모나드가 이걸 어떻게 해결하는지 소개한다.

사실 아까 환경이니 에이전트니 어쩌고 할때부터, 진작에 강화 학습을 마스터한 학생들이 이미 다 아는 내용에 지겨워 졸기 시작하는게 보였다.

다음 수업은 재밌을테니, 대신 그때까지 모나드를 배워오세요.

Read more →
1

도마뱀 사진 포함

안녕하새오.
오늘로 집사가 절 데려온지 30일이 된 도마뱀 앙카에오.
저랑 툿친하시면 귀여운 제 소식을 볼 수 있어오. (평상시 툿은 타임라인 비공개로 올라가오.)

팔로우 한 사람만 맞팔로우 해오. (흔적 남겨도 따로 찾아가지 않아오.)
고마워오.

0
0


[고정]

주된 파는 것
온라인 게임
파이널 판타지 14
- 아이메리크 / 요츠유 드림러 : 겹드림 매우 잘봄
- CP : 진짜 너무 말도 안되는 세상이 멸망할 정도의 CP가 아니면 잘 먹음
- 올라운더

마비노기 / 검은사막
- 쫌쫌따리 하는중...

스팀 및 콘솔 게임
최애
블러드본
- 인형 드림러 : 누가 블본좀 파줘...

P의 거짓
- 논컾, 유사가족 모든 캐릭터 최애

기타 대부분의 게임들을 좋아함

모바일 게임

AFK 새로운 여정
- 여성 멀린
- 올라운더

무기미도
- 남성 국장
- 올라운더

NG
소수자 혐오, 개인적인 괴로운 상황이 연상이 될때

최대한 많이 언급하는걸 적어봤어요. 나머지는 일단 저를 구매해보시고 사용해보시면 될 것 같습니다.
민감한 이야기들은 최대한 CW걸고 이야기 하려고 노력중입니다.
흔적을 남겨주시면 일단 망태기에 넣어버려요. 하루가 지나도 맞팔로우를 하지 않으시면 다시 취소를 합니당

0
0
0

picks of the day:

➡️ @Mastodon - Official account for software powering Mastodon

➡️ @MastodonEngineering - Official tech news & updates

➡️ @AltTextHealthCheck - Percentage of alt text use

➡️ @FediGardenFedi.Garden 🌱 - Nice, well-run servers

:android: Android Apps
@Tusky
@appsFedilab Apps
@SubwayTooter
@moshidonLucas @Moshidon 🇺🇦
@pachli
@rodentapp

:apple_old_logo: iPhone/iPad/Mac Apps
@IceCubesApp
@MonaApp
@ivoryIvory by Tapbots :emoji_wink:
@Feditext

🖥️ Desktop Apps
@Tuba
@tokodon

🌐 Web Clients
@phanpy
@elk

🏡 Managed Hosting
@fedihost
@mastohost

0


- 탐라에 독을 푸는 폭주기관차에요.
- 포인트리스 공장장이에요. 여기서 포인트리스에 대해 이야기할 수는 있지만 공식적인 의견은 아니에요,
- R18언급이 많아요. 물론 연탐에 올리진 않아요.
- 심즈4, 시티즈 스카이라인같은 시뮬레이션 게임류와 플레이스테이션, 엑스박스같은 콘솔게임을 매우 좋아해요.
- 취미로 그림과 만화를 그리고 있어요!
- 지금 탐라에 말하는 폭주기관차를 심어보세요! :iliketrains:

0
0
0

picks of the day:

➡️ @Mastodon - Official account for software powering Mastodon

➡️ @MastodonEngineering - Official tech news & updates

➡️ @AltTextHealthCheck - Percentage of alt text use

➡️ @FediGardenFedi.Garden 🌱 - Nice, well-run servers

:android: Android Apps
@Tusky
@appsFedilab Apps
@SubwayTooter
@moshidonLucas @Moshidon 🇺🇦
@pachli
@rodentapp

:apple_old_logo: iPhone/iPad/Mac Apps
@IceCubesApp
@MonaApp
@ivoryIvory by Tapbots :emoji_wink:
@Feditext

🖥️ Desktop Apps
@Tuba
@tokodon

🌐 Web Clients
@phanpy
@elk

🏡 Managed Hosting
@fedihost
@mastohost

0
0
0
0
0
0
0
0
0
0

Today we are very proud to announce that the United Nations has switched from Google Forms to CryptPad Form for collecting endorsements on the UN Open Source Principles: unite.un.org/news/sixteen-orga

CryptPad Form is a full-fledged application allowing you to build privacy-preserving questionnaires for your respondents.

Try it for free, without even registering an account, on our CryptPad.fr flagship instance!

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

APGでは古式ゆかしく`<div role=dialog">`としているけど、今なら`<dialog>`と`HTMLDialogElement.prototype.showModal`を使うのが良さそう。古い環境もサポートしたいなら`<dialog>`に`role="dialog"`を付けてpolyfillすれば良いだけの話だし。あと`aria-haspopup`も欲しいところ

0
0