전체 글 186

[강화학습] 밴디트 문제

추천 시스템과 같은 문제에서 밴디트 문제는 가장 간단한 예시로 등장한다.강화학습의 기초를 닦기 위해, 밴디트 문제에 대해 이해해보고, 그 해법을 공부해보자.머신러닝 분류와 강화학습머신러닝 기법들은 다루는 문제의 성격을 기준으로 분류할 수 있다.그리고 크게 다음 세가지로 나뉜다.지도 학습비지도 학습강화 학습지도 학습지도학습은 머신러닝에서 가장 전통적인 기법으로, 입력(문제)과 출력(정답)을 쌍으로 묶은 데이터를 통해 문제를 해결한다.지도학습의 가장 큰 특징으로는 이와 같은 명확한 '정답 레이블'의 존재를 들 수 있다.비지도 학습비지도 학습에서는 이러한 '정답 레이블'이 존재하지 않는다.비지도 학습은 데이터에 숨어있는 구조나 패턴을 찾는 용도로 쓰이며, 아래와 같은 곳에 활용된다.군집화(클러스터링)특성 추출..

시간 관리를 위한 10가지 기법

시간 관리는 한정된 자원을 효율적으로 사용하여 목표와 생산성을 높이는 핵심 기술구조적 기법 : Franklin의 하루 분할, 3/3/3 방법, Eisenhower 매트릭스, Pomodoro 기법, 시간 블로킹, Ivy Lee생산성 프레임워크 : GTD, 2분 규칙, Seinfeld 전략, Eat the Frog, 작업 쪼개기멀티태스킹의 해로움을 강조하며, 깊은 집중과 단일 작업의 가치를 Cal Newport의 ‘Deep Work’ 등 연구 결과와 함께 제시전체적으로 시간 관리의 본질은 더 많은 일을 하는 것이 아니라, 집중과 우선순위를 통해 의미 있는 성과를 만들어내는 것서론Lord Chesterfield와 Benjamin Franklin은 각각 “시간을 세심히 관리하라”와 “시간은 돈이다”라는 명언으로..

개인적 공간 2025.08.27

[리팩터링] 테스트 구축하기

리팩터링을 제대로 하려면 견고한 테스트 스위트(test suite)가 뒷받침되어야 한다. 자동 리팩터링 도구를 활영하더라도 이 책에서 소개하는 리팩터링 중 다수는 테스트 스위트로 재차 검증해야 할 것이다.자가 테스트 코드의 가치프로그래머가 어떻게 일하는지 가만히 살펴보면, 실제 코드를 작성하는 시간의 비중은 그리 크지 않다.실제로는 아래와 같은 과정에 훨씬 많은 시간을 쏟는다.현재 상황 파악설계에 대한 고민디버깅이 "디버깅" 시간을 줄이는데, 자가 테스트 코드는 매우 중요하고 훌륭한 도구이다.모든 테스트를 완전히 자동화하고 그 결과까지 스스로 검사하게 만들자.참고) 엄밀하게 말하자면, 테스트 코드는 코드가 잘 동작하는지 확인할 수 있는 모든 종류의 코드이고,자가 테스트 코드는 코드가 스스로 테스트가 성공..

Define-by-Run과 Define-and-Run

딥러닝 프레임워크는 동작 방식에 따라 크게 두 가지로 나눌 수 있다.Define-and-Run (정적 계산 그래프)Define-by-Run (동적 계산 그래프)Define-and-RunDefine-and-Run을 직역하면 '계산 그래프를 정의한 다음 데이터를 흘려보낸다'는 뜻이다.즉, 아래 순서대로 동작이 진행된다.사용자는 계산 그래프를 정의한다.프레임워크는 주어진 그래프를 컴퓨터가 처리할 수 있는 형태로 변환한다.데이터를 흘려보낸다.# 계산 그래프 정의a = Variable('a')b = Variable('b')c = a*bd = c + Constant(1)# 계산 그래프 컴파일f = compile(d)# 데이터 흘려보내기d = f(a=np.array(2), b=np.array(3))먼저 첫 네 줄로 ..

python - from A import B와 import A.B as b의 차이

과거 모듈 내 객체를 싱글톤처럼 사용하려던 기억이 있었는데, 이 둘의 차이를 구분하지 못해 고생했던 기억이 있다.이번 기회에 글로 정리해두었다.하나씩 알아보자.시작하기 전에 - 모듈, 패키지, 라이브러리모듈모듈은 파이썬 파일을 의미한다.특히 다른 파이썬 프로그램에서 import하여 사용하는 것을 가정하고 만들어진 파이썬 파일을 '모듈'이라 한다.모듈은 import 시 sys.modules 딕셔너리에 보관되게 된다.패키지패키지는 여러 모듈을 묶은 것이다.패키지를 만들려면 먼저 디렉터리를 만들고, 그 안에 모듈과 __init__.py 파일을 추가한다.라이브러리라이브러리는 여러 패키지를 묶은 것이다. 그래서 하나 이상의 디렉터리로 구성된다.때로는 패키지를 가리켜 '라이브러리'라고 부르기도 한다.import 동..

python 애스터리스크(*) - 언패킹의 역할과 예제

파이썬에는 애스터리스크가 포인터도 아닌 것이 특이한 일을 하고 있어, 이 코드를 처음 보면 당황하기 부지기수이다.파이썬의 애스터리스크 기호의 사용법에 대해 자세히 알아보자.대입 언패킹함수 호출 시 언패킹리터럴 내부 언패킹대입 언패킹 (Extended Iterable Unpacking, PEP 3132)오른쪽 이터러블을 왼쪽 변수들에 “펼쳐” 넣는다.*가 붙은 변수는 나머지 전부를 리스트로 받는다.*는 각 패턴 레벨에서 최대 1개만 허용된다.a, *rest = [10, 20, 30]*head, b = (1, 2, 3, 4)x, *mid, y = range(5) * 변수는 항상 리스트가 된다.(튜플 아님).최소 길이만 맞으면 남는 요소가 0개여도 동작한다(그 경우 빈 리스트 ([])가 됨).a, *res..

Python - zip의 역할과 예제

파이썬의 zip()은 여러 이터러블(리스트, 튜플, range 등)을 같은 인덱스끼리 묶어 튜플들의 이터레이터를 만든다.핵심 특징게으른 이터레이터결과를 한꺼번에 만들지 않고 필요할 때마다 생성함 → 메모리 절약.가장 짧은 길이 기준으로 끝남.개수 제한 없음zip(a, b, c, ...)처럼 여러 개를 동시에 묶을 수 있음.언패킹으로 ‘되돌리기’zip(*pairs)로 다시 열 단위로 분리함.길이 검사 옵션zip(a, b, strict=True)로 길이가 다르면 ValueError 발생(PEP 618, Python 3.10+).예제 모음1) 기본 사용nums = [1, 2, 3]chars = ['a', 'b', 'c']pairs = list(zip(nums, chars))2) 병렬 반복a = [10, 20,..

[리팩터링] 리팩터링 가이드

읽기 쉬운 코드는 생산성을 크게 올려주기에, 읽기 어려운 코드에 적극적으로 리팩토링을 도입해야 한다. 그렇다면 뭐가 읽기 어려운 코드일까? 지금부터 "코드 냄새"라고 불리는 아래 내용들을 하나씩 짚어볼 것이다.기이한 이름중복 코드긴 함수긴 매개변수 목록전역 데이터가변 데이터뒤엉킨 변경산탄총 수술기능 편애데이터 뭉치기본형 집착반복되는 switch문반복문성의 없는 요소추측성 일반화임시 필드메시지 체인중개자내부자 거래거대한 클래스서로 다른 인터페이스의 대안 클래스들데이터 클래스상속 포기주석기이한 이름'컴퓨터 과학에서 어려운 건 딱 두 가지, 캐시 무효화와 이름 짓기다.'이름이 이상하면, 코드를 이해하기 어렵다.코드는 단순하고 명료하게.마땅한 이름이 떠오르지 않는다면 설계에 더 근본적인 문제가 숨어 있을 가능성..

[밑바닥부터 시작하는 딥러닝] 어텐션 메커니즘

본 내용은 밑바닥부터 시작하는 딥러닝 2도서를 참고하여 작성되었습니다. 밑바닥부터 시작하는 딥러닝 2 - 예스24직접 구현하면서 배우는 본격 딥러닝 입문서 이번에는 순환 신경망과 자연어 처리다! 이 책은 『밑바닥부터 시작하는 딥러닝』에서 다루지 못했던 순환 신경망(RNN)을 자연어 처리와 시계열 데www.yes24.com 드디어, 어텐션이다.현재의 AI 시대를 만든 트랜스포머에 발을 담가볼 수 있게 되었다.그 근간에 있는 어텐션에 대한 학습을 시작해보자.어텐션의 구조어텐션 매커니즘은 seq2seq를 필요한 정보에만 '주목'시킨다.그럼 먼저 seq2seq의 현재 문제점을 살펴보고, 이를 개선한 어텐션 매커니즘을 이해해보자.seq2seq의 문제점seq2seq는 Encoder가 시계열 데이터를 인코딩한다.그..

[리팩터링] 리팩터링 원칙

요약리팩터링은 소프트웨어의 겉보기 동작은 그대로 유지한 채, 코드를 이해하고 수정하기 쉽도록 내부 구조를 변경하는 기법이다.리팩터링은 코드의 이해도를 올리고, 생산성을 올린다.리팩터링 작업은 코드의 이해도를 올리니, 읽기만 하기 보단 리팩터링을 시도해보며 읽는다.쉽다면 직접 리팩터링을 적용해본다.기능 추가 작업과 리팩터링 작업을 분리해라.지금 하고 있는게 리팩터링 작업인지 기능 추가 작업인지 명확히 하라.리팩터링은 경제적인 이유로 해라.리팩터링할 수 있어야 코드를 이해했다고 할 수 있고,코드를 이해해야 새로운 기능을 추가할 수 있다.일단은 성능을 신경쓰지 말고 코드를 작성해라.성능은 이후 성능 테스트/프로파일링을 통해 해결해라.리팩터링의 정의명사 관점소프트웨어의 겉보기 동작은 그대로 유지한 채, 코드를 ..

[리팩터링] 리팩터링 직접 해보기

요약프로그램이 새로운 기능을 추가하기에 편한 구조가 아니라면, 먼저 기능을 추가하기 쉬운 형태로 리팩터링하고 나서 원하는 기능을 추가한다.리팩터링하기 전에 제대로 된 테스트부터 마련한다. 테스트는 반드시 자가진단하도록 만든다.코드를 분석하지 않아도, 코드 스스로가 자신이 하는 일이 무엇인지 이야기할 수 있도록 작성해라. 코드를 분석해서 얻은 정보는 휘발성이 높기로 악명 높은 저장 장치인 머릿속에 기억된다.컴퓨터가 이해하는 코드는 바보도 작성할 수 있다.사람이 이해하도록 작성하는 프로그래머가 진정한 실력자다.지역 변수는 추출을 까다롭게 만든다. 지역 변수를 쿼리 메소드로 대체하자.리팩터링으로 인한 성능 문제는 '특별한 경우가 아니라면 일단 무시하라'!나중에 깔끔해진 코드로 쉽게 개선하라.리팩토링 과정 도중..

[밑바닥부터 시작하는 딥러닝] seq2seq, Encoder-Decoder

본 내용은 밑바닥부터 시작하는 딥러닝 2도서를 참고하여 작성되었습니다. 밑바닥부터 시작하는 딥러닝 2 - 예스24직접 구현하면서 배우는 본격 딥러닝 입문서 이번에는 순환 신경망과 자연어 처리다! 이 책은 『밑바닥부터 시작하는 딥러닝』에서 다루지 못했던 순환 신경망(RNN)을 자연어 처리와 시계열 데www.yes24.com 그동안 RNN과 LSTM의 구조와 구현을 자세하게 살펴봤다.먼저, 이제 이것들을 이용해서 "문장 생성"을 구현해보자.그리고 이를 확장한 seq2seq를 다뤄보며, 인코더-디코더 구조와 그 원리를 이해해보도록 하자.언어 모델을 사용한 문장 생성RNN을 사용한 문장 생성의 순서앞장에서 LSTM계층을 이용하여 언어 모델을 구현했는데, 그 모델의 신경망 구성은 아래 그림처럼 생겼다.그럼 이제 ..

방광암과 CIS, 그리고 그 치료

꾸준히 갱신될 예정입니다.잘못된 정보가 있다면 바로잡아주시길 바랍니다.방광의 구조점막층 (urothelium, 상피층)소변과 직접 맞닿아 있는 표피(상피). 여기서 암이 가장 먼저 발생한다.점막하층 (lamina propria)혈관, 결합조직 등이 있는 얇은 층.근육층 (muscularis propria, detrusor muscle)방광을 수축시켜 소변을 내보내는 진짜 근육.장막/지방층 (perivesical fat, serosa)방광 바깥쪽을 둘러싸는 층.기초 용어기본 용어 정리 표재암이 점막층/점막하층 범위에 존재하는 것침윤암이 근육을 파고든 것.다른 장기에 전이할 가능성이 높음.근치적 방광 절제술과 요로전환술이 요구된다.비근침윤성 방광암(nonmuscle invasive bladder cancer..

[밑바닥부터 시작하는 딥러닝] LSTM

본 내용은 밑바닥부터 시작하는 딥러닝 2도서를 참고하여 작성되었습니다. 밑바닥부터 시작하는 딥러닝 2 - 예스24직접 구현하면서 배우는 본격 딥러닝 입문서 이번에는 순환 신경망과 자연어 처리다! 이 책은 『밑바닥부터 시작하는 딥러닝』에서 다루지 못했던 순환 신경망(RNN)을 자연어 처리와 시계열 데www.yes24.com 망각은 더 나은 전진을 낫는다.- 니체 -RNN의 문제점RNN은 시계열 데이터의 장기 의존 관계를 학습하기 어렵다.BPTT에서 기울기 소실 혹은 기울기 폭발이 일어나기 때문이다. 이번 절에서는 앞장에서 배운 RNN을 복습하고, RNN이 장기기억을 처리하지 못하는 이유를 알아보자.RNN 복습RNN계층은 순환 경로를 갖고 있다.그리고 그 순환을 펼치면 다음과 같이 옆으로 길게 뻗은 신경망이..

MatMul 노드(행렬곱)의 역전파

MatMul 노드의 역전파는 그 결과를 보면 다소 비직관적이다.따라서 이 MatMul의 역전파에 대해 좀 더 자세히 알아보자. 일단 MatMul 노드의 계산 그래프부터 확인해보자.현재 우리에게 주어진 식은 아래와 같다.x = 1xD 행렬W = DxH 행렬y = 1xH 행렬그리고, L에 대하여 x의 i번째 원소에 대한 편미분은 다음과 같이 구한다.우리는 근데 y와 x 사이의 관계를 이미 알고있다.따라서 위 식은 이렇게 치환이 가능하다.위 식에 의하여, L에 대하여 x의 i번째 원소에 대한 편미분의 경우 행렬곱을 이용해서 구해짐을 알 수 있게 된다.그럼 이제 L에 대하여 가중치 W에 대한 편미분을 구할 차례이다.이번엔 미니 배치 처리를 고려해 x에는 N개의 데이터가 담겨 있다고 가정해보자.이를 계산 그래프로..