목록핸즈온 머신러닝 (19)
K 개발자
보상을 최적화하기 위한 학습 강화 학습reinforcement learning(RL)에서 소프트웨어 에이전트agent는 관측observation을 하고 주어진 환경environment에서 행동action을 하고 그 결과로 보상reward을 받는다. 에이전트의 목적은 보상의 장기간 기대치를 최대로 만드는 행동을 학습하는 것 간단히 말해 에이전트는 환경 안에서 행동하고 시행착오를 겪으며 기쁨(양positive의 보상)이 최대가 되고 아픔(음negative의 보상)이 최소가 되도록 학습 양의 보상이 전혀 없을 수도 있다. (e.g. 에이전트가 미로 속을 움직인다면 매 타임 스텝마다 음의 보상을 받기 때문에 가능한 한 빨리 탈출구를 찾는 것이 좋을 것) 정책 탐색 소프트웨어 에이전트가 행동을 결정하기 위해 사용..
오토인코더autoencoder 오토인코더는 입력을 받아 효율적인 내부 표현(잠재 표현latent representation, 코딩coding)으로 바꾸고 (바라건대) 입력과 가장 가까운 어떤 것을 출력 오토인코더는 항상 두 부분으로 구성 입력을 내부 표현으로 바꾸는 인코더encoder(또는 인지 네트워크recognition network)와 내부 표현을 출력으로 바꾸는 디코더decoder(또는 생성 네트워크generative network) 출력층의 뉴런 수가 입력 개수와 동일하다는 것을 제외하면, 일반적으로 오토인코더는 다층 퍼셉트론(MLP)과 구조가 동일 오토인코더가 입력을 재구성하기 때문에 출력을 종종 재구성reconstruction이라고 부른다. 비용 함수는 재구성이 입력과 다를 때 모델에 벌점을..
Char-RNN RNN을 훈련하여 문장에서 다음 글자를 예측 (한 번에 한 글자씩 새로운 텍스트를 생성할 수 있다.) 순차 데이터셋을 나누는 방법 텍스트에 있는 글자는 섞으면 안 된다. 훈련 세트, 검증 세트, 테스트 세트가 중복되지 않도록 만드는 것이 중요 (두 세트 사이에 문장이 걸치지 않고 완전히 분리될 수 있도록 세트 사이에 간격을 두는 것도 좋은 생각) 시계열을 다룰 때는 보통 시간에 따라 나눈다. (경우에 따라 훈련할 시간 간격을 더 길게 하기 위해 다른 차원을 기준으로 나눌 수도 있지만 시간에 따라 나누는 것이 안전) 암묵적으로 RNN이 과거(훈련 세트)에서 학습하는 패턴이 미래에도 등장한다고 가정 다른 말로 하면 이 시계열 데이터가 (넓은 의미에서) 변하지 않는다stationary고 가정 ..
순환 뉴런recurrent neuron과 순환 층 순환 신경망recurrent neural networks은 (활성화 신호가 입력층에서 출력층 한 방향으로만 흐르는) 피드포워드 신경망과 비슷하지만 뒤쪽으로 순환하는 연결도 있다는 점이 다르다. (입력을 받아 출력을 만들고 자신에게도 출력을 보내는 뉴런으로 구성) 각 타임 스텝time step $t$ (또는 프레임frame) 마다 순환 뉴런은 $x_ {(t)}$와 이전 타임 스텝의 출력인 $y_ {(t-1)}$을 입력으로 받는다. (첫 번째 타임 스텝에서는 이전 출력이 없으므로 일반적으로 0으로 설정) 각 순환 뉴런은 입력 $x_ {(t)}$와 이전 타임 스텝의 출력 $y_ {(t-1)}$을 위한 두 벌의 가중치를 가진다. (이 가중치 벡터를 $w_ {x}..
합성곱 층convolutional layer 첫 번째 합성곱 층의 뉴런은 입력 이미지의 모든 픽셀에 연결되는 것이 아니라 합성곱 층 뉴런의 수용장 안에 있는 픽셀에만 연결 두 번째 합성곱 층에 있는 각 뉴런은 첫 번째 층의 작은 사각 영역 안에 위치한 뉴런에 연결 이런 구조는 네트워크가 첫 번째 은닉층에서는 작은 저수준 특성에 집중하고, 그다음 은닉층에서는 더 큰 고수준 특성으로 조합해나가도록 도와준다. 수용장 사이에 간격을 두어 큰 입력층을 훨씬 작은 층에 연결하는 것도 가능 (한 수용장과 다음 수용장 사이 간격을 스트라이드stride라고 한다.) 필터filter(합성곱 커널convolution kernel) 뉴런의 가중치는 수용장 크기의 작은 이미지로 표현될 수 있다. 층의 전체 뉴런에 적용된 하나의..
텐서플로에서 데이터를 효율적으로 적재, 파싱, 전처리 메모리 용량에 맞지 않는 아주 큰 규모의 데이터셋으로 딥러닝 시스템을 훈련해야 하는 경우가 많다. 다른 딥러닝 라이브러리를 사용해서는 대규모 데이터셋을 효율적으로 로드하고 전처리하도록 구현하기가 까다롭지만 텐서플로 데이터 API는 이를 쉽게 처리 텐서플로가 멀티스레딩, 큐, 배치, 프리페치prefetch 같은 상세한 사항을 모두 대신 처리해주며 데이터 API는 tf.keras와 잘 동작 기본 기능으로 데이터 API는 텍스트 파일(e.g. CSV 파일), 고정 길이의 레코드를 가진 이진 파일, 텐서플로의 TFRecord 포맷을 사용하는 이진 파일에서 데이터를 읽을 수 있다. (이 포맷은 길이가 다른 레코드를 지원) TFRecord는 일반적으로 (오픈 소..
수동 미분 미적분을 사용하여 편도함수를 유도 함수가 아주 복잡해지면 번거롭고 실수할 위험이 크다. 유한 차분 근사finite difference approximation $x_ {0}$에서 함수 $h(x)$의 도함수 ${h}'(x_ {0})$는 그 포인트에서 함수의 기울기 ($x$가 포인트 $x_ {0}$에 무한히 가까워질 때 두 점을 지나는 접선의 기울기) ${h}'(x_ {0})=\lim_{x \to x_ {0}}\frac{h(x)-h(x_ {0})}{x-x_ {0}}=\lim_{\varepsilon \to 0}\frac{h(x_ {0}+\varepsilon)-h(x_ {0})}{\varepsilon}$ (뉴턴 차분몫Newton's difference quotient) 결과가 정확하지는 않다. (다른..
텐서플로 훑어보기 텐서플로는 강력한 수치 계산용 라이브러리 특히 대규모 머신러닝에 잘 맞도록 튜닝되어 있다. (하지만 계산량이 많이 필요한 어떤 작업에도 사용 가능) 핵심 구조는 넘파이와 비슷하지만 GPU를 지원 (여러 장치와 서버에 대해서) 분산 컴퓨팅을 지원 일종의 JITjust-in-time 컴파일러를 포함한다. 속도를 높이고 메모리 사용량을 줄이기 위해 계산을 최적화한다. 이를 위해 파이썬 함수에서 계산 그래프computation graph를 추출한 다음 최적화하고 (e.g. 사용하지 않는 노드node를 가지치기) 효율적으로 실행 (e.g. 독립적인 연산을 자동으로 병렬 실행) 계산 그래프는 플랫폼에 중립적인 포맷으로 내보낼 수 있으므로 한 환경(e.g. 리눅스에 있는 파이썬)에서 텐서플로 모델을..