목록독서 (19)
while (1): study();

14. 반복형, 반복자, 제네레이터 파이썬은 반복형(Iterable)에서 반복자(Iterator)를 가져온다. 반복형 __iter__(): 반복자를 새로 생성 __iter__() 확인 -> __getitem__() 확인 (하위 버전과의 호환성) -> TypeError * 반복형은 반복자로 작동하면 안된다. 다중 반복을 지원하려면 여러 독립적인 반복자를 가질 수 있어야하며, 각 반복자는 고유한 내부 상태를 유지해야 하기 때문. 반복자 __next__(): 다음 항복 반환, 없으면 StopIteration __iter__(): 편의상 self 반환 제네레이터 함수 - 본체 안에 yield 키워드를 가진 함수, 제네레이터 팩토리 - 제네레이터 객체를 반환 - return은 오직 StopIteration 예외를..

8. 객체 참조, 가변성, 재활용 변수 변수는 객체에 붙은 레이블 변수가 객체에 바인딩됐다는 표현이 타당함 정체성 정체성은 메모리 내의 객체 주소, is연산자는 두 객체의 정체성을 비교 * is연산자가 ==연산자보다 빠르다. 참조로서의 함수 매개변수 1) call-by-value: 값을 복사 (원본 변경 x) 2) call-by-reference: 참조를 복사 (원본 변경 o) 3) call-by-sharing: 객체 참조를 복사 (가변형 변경 o, 불변형 변경 x) -> 정체성 변화 x * 가변형을 매개변수로 사용하는 경우 1) 기본값으로 사용: 모듈 로딩 시 평가, 기본값은 함수 객체의 속성 -> 불안정 class HauntedBus: def __init__(self, passengers=[]): #..

5. 일급 함수 일급 객체 1. 런타임에 생성 가능 2. 데이터 구조체의 변수나 요소에 할당 가능 3. 함수 인수로 전달 가능 4. 함수 결과로 반환 가능 고위 함수(higher-order function): 함수를 결과로 반환하는 함수 map(), filter() -> 컴프리헨션의 등장으로 중요성 저하 reduce() all(): 모든 iterable이 참이면 true any(): iterable이 하나라도 참이면 true 람다: 최대한 안 쓰는게 좋음 (가독성) 매개변수 *을 기점으로 위치 매개변수와 키워드 매개변수를 나눔 def f(a, *, b): # b는 기본값이 지정되지 않은 키워드 매개변수 return a, b * 매개변수 추출: inspect 이용 from inspect import sig..

2. 시퀀스 분류 컨테이너 시퀀스: 서로 다른 자료형의 항목을 담을 수 있음, 객체 참조를 담음 ex) list, tuple, collections.deque 균일 시퀀스: 단 하나의 자료형만 담을 수 있음, 객체의 값을 직접 메모리에 할당 ex) str, bytes, bytearray, memoryview, array.array 가변 시퀀스: list, bytearray, array.array, collections.deque, memoryview 불변 시퀀스: tuple, str, butes array.array: 수치 연산에 최적화 Memoryview: 데이터 구조체를 복사하지 않고 메모리 공유 bisect 순서 유지하면서 항목 추가 : bisect.insort() 정렬된 시퀀스를 효율적으로 검색 ..

1. 파이썬 데이터 모델 특별 메서드 사용자 정의 객체도 내장형 객체처럼 작동하게 함 인터프리터가 호출하기 위함 문자열 __repr__: 디버깅 및 로그에 사용하는 형태, __str__이 없을 시 default __str__: 사용자에게 보여주기 위한 형태 * MOP(Metaobject protocol): 하위 레벨 추상으로 상위 기능 구현

드디어 최근 인공지능 SOTA의 핵심에 서있는 어텐션을 구현합니다. 이전까지 단어 간 대응 관계를 나타내는 정보인 얼라인먼트(Alignment)를 인간이 직접 만들어야만 했다면, 어텐션은 얼라인먼트조차 기계가 대신 학습한다는 점에서 큰 의미가 있습니다. 간단하게 얘기하면 인코더의 은닉상태를 입력으로 받아, 디코더의 은닉상태와 내적한 뒤 소프트맥스로 정규화하여 가중치를 구하고, 이를 이용하여 가중합을 구해 맥락 벡터(Context vector)를 생성합니다. 이전 장에서 Peeky를 이용하여 인코더의 은닉상태를 디코더의 모든 계층에 전달했었는데, Attention은 이 과정을 조금 더 효율적으로 수행하고 있습니다. 그리고 Seq2seq 모델의 관건이 인코더의 맥락을 디코더에 제대로 전달하는 것이라는 것도 ..

이번 장에서는 RNN 아키텍처를 이용한 생성 모델의 끝판왕인 Seq2Seq을 간단하게 구현해봅니다. 일전에 Seq2seq 기계번역기를 수업을 들으며 꽤 그럴싸하게 구현한 적이 있었는데, 당시엔 파이토치를 사용하여 구현했기 때문에, 원리도 알아볼겸 천천히 책을 따라가봤습니다. 일전에 구현했던 기계번역기 모듈은 다음 깃허브 레포에 있습니다. https://github.com/jeongchanyoung-1234/Neural_Machine_Translation GitHub - jeongchanyoung-1234/Neural_Machine_Translation: Neural Machine Translation with Attention (Experiment result will be up Neural Machin..

이번 장에서는 Vanilla RNN에서 개선된 버전인 LSTM을 구현하여 본격적인 RNN LM을 구축합니다. 기존의 Vanilla RNN은 다음과 같이 계산됩니다. $$h_{t} = tanh(h_{t-1}W_{h} + x_{t}W_{x} + b)$$ 이 때 $W_{h}$와 $W_{X}$는 계층 내에서 같은 가중치이므로, 타임스탭이 길어질 때마다 매번 같은(정확히는 비슷한) 행렬이 입력에 곱해지게 됩니다. 행렬의 최대 특잇값이 1보다 크다면 출력은 지수적으로 증가하고, 1보다 작으면 지수적으로 감소합니다. 따라서 역전파 과정에서 커지거나 작아진 가중치가 곱해지면 기울기도 그에 따라서 폭발하거나 소실될 가능성이 증가합니다. 또한 하이퍼볼릭 탄젠트 함수의 도함수가 0부터 1사이의 값을 가질 수 있기 때문에, ..

드디어 자연어처리의 핵심 기술 중 하나라고 할 수 있는 순환 신경망에 접어들었습니다. 저번 장에서 구현했던 CBOW는 기본적으로 FFN(Feed Forward Network)이며, 결과적으로 임의의 귀납적 편향(Arbitrary inductive bias)를 주입합니다. 쉽게 말하면 자연어의 특성 중 하나인 순차성에 대해서는 전혀 고려하지 않는다는 것입니다. 따라서 언어모델을 구축하기 위해서는 다른 아키텍처가 필요합니다. 언어모델(LM; Language Model)이란 특정한 언어 시퀀스의 확률을 반환하는 모델으로, 실제 일상 속 문장의 발생확률을 모사하는 것을 목표로 합니다. 문장의 발생 확률은 간단하게 다음과 같이 동시확률로 표현할 수 있습니다. $$P(w_{1}, w_{2}, ...)$$ 여기에 순..

이 장에서는 이전 장에서 구현했던 Word2Vec의 속도를 개선해봅니다. 두 가지 측면에서 개선점이 있습니다. 1. Embedding layer를 이용한 입력층 연산 감소 2. Negative sampling을 이용한 출력층 연산 감소 추가적으로 단어의 밀집 벡터를 통계 기반 방법으로 얻은 경우 Distributional representation이라고 표현하며, 추론 기반 방법으로 얻은 경우 Distributed representation이라고 표현합니다. 따라서 우리는 결론적으로 최적의 Distributed representation을 얻는 것이 목표입니다. 1. Embedding layer 이전의 CBOW는 입력 가중치가 (Vocab size, Hidden size)였습니다. 입력으로 주어지는 맥락..