퍼리개발자 친구들도 해커스펍으로 끌어들이는 상상

洪 民憙 (Hong Minhee)
@hongminhee@hackers.pub · 259 following · 174 followers
Hi, I'm who's behind Fedify, Hollo, BotKit, and this website, Hackers' Pub!
Fedify, Hollo, BotKit, 그리고 보고 계신 이 사이트 Hackers' Pub을 만들고 있습니다.
Website
- hongminhee.org
GitHub
- @dahlia
Hollo
- @hongminhee@hollo.social
DEV
- @hongminhee
velog
- @hongminhee
Qiita
- @hongminhee
Zenn
- @hongminhee
Matrix
- @hongminhee:matrix.org
X
- @hongminhee
어제 타임라인에서 맥미니 서버로 어느정도 규모까지 버틸 수 있을지에 대한 고민이 지나가는걸 봤는데 1월부터 신형 맥미니로 이것저것 운영해본 경험 안에서는 오히려 문제는 서버 기계가 아니라 가정용 전원과 가정용 인터넷에서 터질 것 같다.
hello world
소프트웨어 개발자들이 자주 틀리는 외래어 표기법.
영어 | 틀린 표기 | 올바른 표기 |
---|---|---|
app | 어플 | 앱 |
application | 어플리케이션 | 애플리케이션 |
directory | 디렉토리 | 디렉터리 |
front-end | 프론트엔드 | 프런트엔드 |
message | 메세지 | 메시지 |
method | 메소드 | 메서드 |
release | 릴리즈 | 릴리스 |
repository | 레포지토리 | 리포지터리 |
또 있을까요?
@hongminhee洪 民憙 (Hong Minhee) 전.. branch를 브런치라 읽으시는 분을 봤습니다... 배고프셨나봅니다.
안녕하세요! Markdown을 사용할 수 있다니 너무 좋네요!
@alanbondarun넙죽스 님 어서 오세요!
안녕하세요! Markdown을 사용할 수 있다니 너무 좋네요!
<Tracing the thoughts of a large language model>
LLM이 어떻게 생각하는지 추적하는 연구인데 아주 흥미롭다. LLM이 단순히 바로 다음에 올 높은 확률의 단어를 선택할 것이라고 생각했지만, 실제로는 미리 단어를 계획한 다음에 문장을 완성했다고. 다국어 구사와 암산 부분도 재미있다. 인간이 생각하는 방식과 크게 다르지 않은 것 같은데 기계가 정말 생각을 못한다고 할 수 있을까...
https://www.anthropic.com/research/tracing-thoughts-language-model
GN⁺: 대형 언어 모델의 사고 과정을 추적하기
------------------------------
- Claude 같은 언어 모델은 사람이 직접 프로그램한 것이 아니라 방대한 데이터로 학습됨
- 학습 과정에서 문제 해결 전략을 스스로 학습하며, 이 전략은 수십억 개의 연산에 암호화되어 있음
- 결과적으로 모델 개발자조차도 Claude가 대부분의 작업을 어떻게 수행하는지 완전히 이해하지 못함
- Claude 같은 모…
------------------------------
https://news.hada.io/topic?id=20002&utm_source=googlechat&utm_medium=bot&utm_campaign=1834
@devuntfinn 님도 어서 오세요!
Claude에 Brave Search를 붙였는데 올해를 24년으로 인식한다. Claude의 잘못인가 Brave Search의 잘못인가. query를 작성하는건 Claude니까 Claude 잘못이겠지?
@smartbosslee이현석 이상하네요. Claude의 시스템 프롬프트에는 현재 날짜가 포함되게 되어 있을 텐데요… 🤔
The current date is {{currentDateTime}}.
better CSS에 대한 접근들(CSS-in-JS, Atomic CSS, Preprocessor)의 공통된 한계는 constraint solving 방식이 아니란 것이다.
다들 어떤 기존의 스타일을 '덮어쓰는' 방법, 근데 개중에 좀 잘 덮어쓰는 방법을 찾고 있다. 그런데 많은 경우, 뭔가를 덮어쓰려고 하고 있다면, 그건 사실 값을 덮어쓰는게 아니고 만족해야할 조건을 추가하고 싶은거다. 값을 덮어쓰는 것은 조건을 추가하는 방법 중 가장 강제적인 하나의 방법일 뿐이고. 즉, 디자인 시스템은 어떤 조건들의 합들로부터 실제 스타일을 구하는 방법이어야 하고, 개발자는 조건만 명시할 수 있어야 한다.
constraint solving을 잘 설계하고 구현하는게 어렵다 왜 이렇게 안 하냐고 하긴 좀 거시기하다. 그래서 나도 요즘 propagator를 공부중이다.
@hongminhee洪 民憙 (Hong Minhee) 해커스펍의 ‘게시글만’ 탭을 선택했을 때 개별 게시글을 한 번만 노출되게 하는 방법이 있을까요? 지금은 공유된만큼 게시글이 노출돼서 같은 게시글이 여러 번 나옵니다.
@curry박준규 네, “게시글만” 탭뿐만 아니라 타임라인 전반에 대해서 중복된 글이 한 번만 나오도록 개선하려고 합니다.
데이터에서 인과 관계를 아예 찾을 수 없냐면, 그렇지는 않습니다. 그 과정이 생각보다 조금 더 단계가 많을 뿐입니다. 인과 분석에 있어서, 인과 구조가 단순히 ‘뭐가 바뀌면 뭐가 바뀐다‘ 이상으로 다양하고, 어떤 식으로 다양할 수 있는지를 이해해야 인과 관계를 가정하고 조건적 사고를 진행할 수 있을 것입니다. 이를 고려하지 않고 너무 인과관계를 단순하게 보다보니 잘못된 내용을 호도하거나 아예 배제하는 경우가 종종 눈에 띄어 아쉽습니다. 관련하여 인과 관계 구조를 구분하고 각각의 분석법을 훑어볼 수 있게 정리해 보았습니다. https://cojette.github.io/posts/structureofcausation/
베이즈 확률론에서 사후 확률을 다룰 때 베타 분포를 가정한다. 베타 분포의 확률 밀도 함수는 다음과 같다.
여기서 B(α,β)는 베타 함수이며 다음과 같이 정의된다.
eqn은 markdown-it-texmath에서 생성한 것이고 xss filter에 걸린 것으로 보인다.
@parkjinwoo박진우 이제 고쳐졌습니다!
안녕하세요! 두리번두리번..
안녕하세요! 두리번두리번..
@ipurisHan Park 안녕하세요, 어서 오세요!
@cosmicgy김가영 안녕하세요, 어서 오세요!
게시글에 목차가 추가되었습니다. 게시글 안에 소제목이 있을 경우에는 목차가 보이게 됩니다. 가로로 넓은 화면에서는 오른쪽에 보이고, 모바일 환경처럼 가로로 좁은 화면에서는 제목 아래 본문 위에 보이게 됩니다.
여기에도 bluesky에 한 것처럼 블로그에 포스트를 올릴 때마다 자동으로 포스트 할 수 있을까… 시간 날 때 한 번 찾아봐야.
@jjme정진명 아직은 API가 없긴 한데 곧 생길 예정입니다!
해커스펍 계정을 만들었습니다. 권유와 초청 주신 분들 감사합니다.
저는 게임 기획자로 일하고 있습니다만, 요즘 몇년은 js/react로 제품에 들어갈 코드를 짜는 일이 많습니다. 최근에는 https://guji.jjme.me/ 에서 블로그를 쓰는 데 많은 에너지를 쓰고 있습니다.
@jjme정진명 어서 오세요!
여기에도 bluesky에 한 것처럼 블로그에 포스트를 올릴 때마다 자동으로 포스트 할 수 있을까… 시간 날 때 한 번 찾아봐야.
해커스펍 계정을 만들었습니다. 권유와 초청 주신 분들 감사합니다.
저는 게임 기획자로 일하고 있습니다만, 요즘 몇년은 js/react로 제품에 들어갈 코드를 짜는 일이 많습니다. 최근에는 https://guji.jjme.me/ 에서 블로그를 쓰는 데 많은 에너지를 쓰고 있습니다.
@xxwxn신신 님, 어서 오세요!
.vimrc 파일 공유하던사람들끼리 창업해서 CLI 깎는 회사 만들고 6백만달러를 펀딩받았다는 이야기가 있다. 나는 이 이야기를 아주 좋아한다.
코드 리뷰 요정, CodeRabbit이 나타났다 🐰 https://tech.inflab.com/20250303-introduce-coderabbit/
코드래빗에 저렇게 프롬프트를 넣을 수 있는거구나.....
한국의 Clojure 생태계를 책임지는 슈퍼루키 트친도 영입하고 있는 중인데, 이 계정도 추천해야겠다. 아니, 근데.. 클로져리안 모아놓은 인스턴스도 있었네????
오케이 계획대로 되고잇서 오케이 계획대로 되고잇서
https://social.silicon.moe/@kodingwarrior/114230625246731863
https://choubey.gitbook.io/internals-of-deno
Deno 런타임 내부 까보는거 입문은 이걸로 시작해야겠다
오 새로운 공간... 낯설다..!!!
오 새로운 공간... 낯설다..!!!
@sonsubari바리 안녕하세요, 어서 오세요!
타임라인이 느려진 것 같아서 EXPLAIN ANALYZE
결과를 Claude Sonnet 3.7 Thinking에게 던져 주고 추가할 색인을 추천 받아서 색인을 생성해 보았다. 빨라졌는지는… 모르겠다. 😂
The #OpenTelemetry JavaScript SDK 2.0 is here!
토끼가 갉아서 선이 끊기는 바람에 옆 동네 서버가 내려갔었던 기억이 새삼
토끼는 연합우주에 해롭슴다
https://hackers.pub/@diarapin/0195d671-9321-70d7-8252-f0fcccbd1185
@diarapin금강토
@hongminhee洪 民憙 (Hong Minhee) 홈서버일 줄은 몰랐네요. 맥미니 전원 버튼 지켜. (두분 티키타카 귀여워여. 😂)
@pribess 님 어서 오세요!
洪 民憙 (Hong Minhee) 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
를 인자로 받아 죽을 때까지 선택한 행동들을 반환한다.
그런데 이건 너무 외연적인 정의고, 환경과 에이전트가 보통 만족할만한 조건을 나열해보자면 이렇다.
- 환경은 상태를 가지고 있고 시간이 지남에 따라 변경된다
- 상태는 에이전트가 무엇을 관측할지를 결정한다
- 에이전트의 행동은 다음 상태에 영향을 끼친다
이 조건들을 바탕으로 환경을 좀더 구체적으로 정의하면 다음과 같다.
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 를 가질 수 있어야 한다. 가령 온라인 게임을 환경으로 삼는다면, 환경은 네트워킹을 할 수 있어야 한다. 또, 에이전트는 매번 똑같은 선택이 아닌 확률적 선택을 하고 싶을텐데, 이는 순수 함수로써는 불가능하다.
그러면 부수효과를 허용하면 되는거 아냐?
맞다. 나처럼 시간이 많다면 직접 해보는 것도 나쁘지 않다. 하지만 정의가 점점 지저분해지는 것을 보게될 것이고...
시간을 아껴주기 위해 정답을 알려주겠다. 환경은 에이전트가 실행될 수 있는 모나드여야 한다. 딱 거기까지여야 한다. 환경과 에이전트 사이에 그 이상의 관계는 부적절하다.
글이 생각했던 것보다 길어져버려서, 오늘은 여기까지 해야겠다. 이어지는 글에서 거꾸로 상태 모나드가 이걸 어떻게 해결하는지 소개한다.
사실 아까 환경이니 에이전트니 어쩌고 할때부터, 진작에 강화 학습을 마스터한 학생들이 이미 다 아는 내용에 지겨워 졸기 시작하는게 보였다.
다음 수업은 재밌을테니, 대신 그때까지 모나드를 배워오세요.
단문과 게시글이 구분되는구나 ㅇㅎ~~ 갓잇
코딩을 취미로 하면 학습, 창조, 해결의 즐거움을 느낄 수 있다.
결론 : 코딩하고 싶다. ㅠㅠㅠ
@hongminhee洪 民憙 (Hong Minhee) 네, 내 글이 인용된 횟수와 인용한 글의 목록을 보는 걸 말씀 드렸습니다. 인용 자체가 확장 스펙이군요⋯
@curry박준규 피인용도 확장 스펙이 있는데 널리 쓰이진 않는 듯해요.
액티비티펍에서도 트위터에서와 같이 피인용 글을 다루는 스펙이 있나요?
@curry박준규 피인용을 다룬다 하면 어떤 걸까요…? 내 글을 인용한 글의 목록을 보는 건가요?
일단 인용 자체가 ActivityPub 자체에 없어서 확장 스펙으로 정해져 있어요.
@hongminhee洪 民憙 (Hong Minhee) 이거 누르면 어떻게 되나요
저… 제가 아마도 해커스펍 개발자분보다도해커스펍 서버와 가장 가까이서(2미터 거리) 쓰고 있는 유저인데…
느려요.
RE: https://hackers.pub/@hongminhee/0195d567-06d6-7437-a4eb-cf567adf9714
연합우주의 토끼 하면 basix님의 bunbers가 떠오르는… 🐰
Hackers' Pub은 과연 언제까지 우리집 홈서버에서 버틸 수 있을 것인가…!? (걱정하시는 분들을 위해: 백업은 6시간마다 정기적으로 하고 있습니다.)
@hongminhee洪 民憙 (Hong Minhee) 이거 누르면 어떻게 되나요
@hongminhee洪 民憙 (Hong Minhee) 너무 가고 싶은데 육아 때문에 갈 수가 없어서 너무 아쉽습니다. 마음 같아서는 유튜브 라이브 해달라고 하고 싶어요.
@curry박준규
@hongminhee洪 民憙 (Hong Minhee) 아이를 델고오셔서 인류 최초의 네이티브 하스켈 스피커로 키워보는건 어떨까요?
무슨 이야긴가 궁금해서 찾아보고 …. 너무 귀여워서 비명을 질렀어요…. 토끼가 전선을 갉아먹어서 서버가 다운되다니……..