목록전체 글 (302)
elevne's Study Note

DFS, BFS 는 대표적인 그래프 탐색 알고리즘이다. (탐색이란 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정을 말한다) DFS, BFS 에 대해 공부하기 위해 우선 몇 가지 자료구조에 대해 알아본다. 스택 자료구조라는 것이 있다. 스택 자료구조는 먼저 들어온 데이터가 나중에 나가는 선입후출의 자료구조를 갖는다. 입구와 출구가 동일한 형태로 스택을 시각화할 수 있다. Python 에서 stack 에 데이터를 추가할 때는 append 함수, 원소를 삭제할 때는 pop 함수를 사용한다. 다음으로는 큐 자료구조가 있다. 큐는 먼저 들어 온 데이터가 먼저 나가는 선입선출의 자료구조를 갖는다. 큐는 입구와 출구가 모두 뚫려 있는 터널과 같은 형태로 시각화할 수 있다. Python 에서 큐 자료구조를 활용하..

저번 시간에 모델을 만들어 보는 코드까지 알아보았다. 이번에는 모델에 넣어줄 수 있는 파라미터들에 대해 알아보았다. 파라미터들로는 손실함수, 옵티마이저, 스케줄러, 메트릭을 넣어주어야 했다. 손실함수: 학습하는 동안 출력과 실제 값 사이의 오차를 측정한다. BCELoss: 이진 분류 CrossEntropyLoss: 다중 클래스 분류 MSELoss: 회귀 모델 옵티마이저: 데이터와 손실함수를 바탕으로 모델의 업데이트 방법을 결정한다. step() 메서드를 활용하여 전달받은 파라미터들을 업데이트하며, zero_grad() 메서드를 활용하여 옵티마이저에 사용된 파라미터들의 기울기를 0으로 만든다. 스케줄러를 활용하여 에포크에 따른 학습률을 조절할 수 있다. optim.Adadelta, optim.Adagrad..

도커 엔진은 설치와 함께 실행되며 계속 동작 상태로 남아있는다. 하지만 컨테이너를 실행중인 것이 아니라면 컴퓨터의 리소스를 거의 차지하지는 않는다. 도커의 컨테이너들은 도커 엔진이 한 번 종료되면 모두 정지상태로 변하게 된다. 컨테이너는 도커 엔진과 다르게 자동 실행 설정이 없으므로 서버의 전원이 내려간 상태에서 도커 엔진과 함께 컨테이너를 복구하려면 컨테이너를 따로 실행하는 스크립트를 작성해야 한다. 이제부터는 도커의 명령어에 대해서 알아볼 것이다. 명령 프롬프트에서 명령어를 입력하고 실행하는데, 컨테이너를 다루는 모든 명령은 'docker' 명령어로 시작한다. 도커 명령어는 기본적으로 "docker 커맨드(상위커맨드-하위커맨드) 대상" 의 형식으로 이루어지게 된다. 여기에 옵션과 인자라는 추가 정보를..

PyTorch 는 2017 년에 공개된 딥러닝 라이브러리로 Lua 언어로 개발되었던 Torch 를 페이스북에서 파이썬 버전으로 내놓은 것이다. PyTorch 는 GPU 에서 텐서 조작 및 동적 신경망 구축을 지원한다. 내부적으로 CUDA, cuDNN 를 사용하여 GPU 연산을 진행한다. 아래 사진은 PyTorch 의 구조를 보여준다. Top-level API 에 해당하는 패키지들은 아래와 같다. torch: GPU 를 지원하는 텐서 패키지로 다차원 텐서를 기반으로 다양한 수학적 연산이 가능하도록 한다. torch.autograd: 자동 미분 패키지로, '자동 미분(auto-differentiation)' 이라는 기술을 사용하여 미분 계산을 효율적으로 처리한다. '연산 그래프'가 즉시 계산(실시간으로 네트..
알고리즘 자체는 간단하지만 코드가 길어지거나 작성하기 까다로운 문제들이 있다. 이러한 문제들에는 모든 경우의 수를 주저 없이 다 계산하는 방식을 사용하는 완전탐색, 제시한 알고리즘을 한 단계씩 차례대로 직접 수행해야 하는 시뮬레이션 유형이 있다. (해당 책에서는 둘을 묶어 구현 파트에 넣어두었다) 두 유형에 해당하는 문제들을 하나씩 살펴보았다. 알고리즘 문제에서는 행렬을 많이 사용하게 된다. 2차원 행렬 위에서 캐릭터가 특정 규칙에 의해 좌표를 이동하는 등의 문제가 자주 출제된다고 한다. 아래는 하나의 예시 문제이다. 문제 1) 여행가 A는 N x N 크기의 정사각형 공간 위에 서 있다. 이 공간은 1 x 1 크기의 정사각형으로 나누어져 있다. 가장 왼쪽 위 좌표는 (1, 1)이며, 가장 아래 좌표는 (..

Greedy Algorithm 은 현재 상황에서 지금 당장! 좋은 것만 고르는 방법을 의미한다. 일반적인 그리디 알고리즘은 문제를 풀기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 요구한다. 아래와 같은 예시 문제 상황을 보면 이해가 쉽다. [문제 상황] 루트 노드부터 시작하여 거쳐가는 노드 값의 합을 최대로 만들고 싶을 때 어떻게 이동해야 할까? 그리디 알고리즘은 위 문제상황에서 단순히 매 상황에서 가장 큰 값만 고르는 방법을 택한다. 위 노드에서 7, 9 를 순서대로 고르는 것이 아니라 10, 4 를 선택하게 되는 것이다. (그래서 일반적인 상황에서 그리디 알고리즘은 최적의 해를 보장할 수는 없다) 그리디 알고리즘의 대표적인 문제로 동전 거스름 문제가 있다. 문제 1) 당신은 음식점의 계산을 도와..

복잡도란 알고리즘의 성능을 나타내는 척도이다. 복잡도는 시간복잡도와 공간복잡도로 나누어진다. 시간복잡도: 알고리즘을 위해 필요한 연산의 횟수 (알고리즘이 얼마나 오래 걸리는가) 공간복잡도: 알고리즘을 위해 필요한 메모리의 양 (알고리즘이 얼마나 많은 메모리를 차지하는가) 동일한 기능을 수행하는 알고리즘이 있을 때 시간복잡도와 공간복잡도가 낮은 것이 더욱 좋은 것으로 일반적으로 해석될 수 있는 것이다. 또한, 효율적인 알고리즘을 사용한다고 했을 때 일반적으로 시간복잡도와 공간복잡도는 일종의 Trade-off 관계가 성립된다고 한다. 메모리를 조금 더 많이 사용하는 대신 반복되는 연산을 생략하거나 더 많은 정보를 관리하면서 계산의 복잡도를 줄일 수 있는 것이다. (이 때 메모리를 더 소모하는 대신에 얻을 수..
모든 React Component 에는 라이프사이클(수명주기)가 존재한다. 컴포넌트의 수명은 페이지에 렌더링되기 전인 준비과정에서 시작하여 페이지에서 사라질 때 끝나는 것이다. React 로 개발을 하다보면 Component 를 처음으로 렌더링할 때 어떠한 작업을 처리해야할 때도 있고, Component 를 업데이트하기 전후로 어떠한 작업을 처리해야할 수도 있다. 이 떄 Component 의 라이프사이클 메서드가 사용된다고 한다. (라이프사이클 메서드는 클래스형 컴포넌트에서만 사용할 수 있으며 함수형에서는 Hooks 를 사용하여 비슷한 작업을 처리해줄 수 있다고 한다) 라이프사이클은 마운트, 업데이트, 언마운트 세 가지로 나뉘어진다. DOM 이 생성되고 웹 브라우저 상에 나타나는 것을 Mount 라고 한..