백준에서 알고리즘 문제를 풀 때, 시간 초과로 인해 문제를 통과하지 못하는 경우가 있다. 이는 작성한 코드의 실행시간이 너무 길게 나와 통과하지 못하는 경우로 알고리즘의 수행 시간을 평가하는 시간 복잡도와 관련이 있다. 빅오(Big-O) 표기법 시간 복잡도는 알고리즘의 수행 시간을 평가하는 것으로 빅오(Big-O) 표기법을 이용하여 알고리즘의 성능을 나타낸다. 우리는 문제에 맞게 최대한 시간 복잡도를 고려하여 가장 효율적인 알고리즘을 선택하여 사용해야 한다. 빅오 표기법의 경우 불필요한 연산을 제거하여 알고리즘 분석을 쉽게 할 목적으로 사용이 된다. 여기서 가장 중요한 것은 중요하지 않은 시간 복잡도를 계산할 때, 중요하지 않은 상수와 계수들을 제거하면 알고리즘 실행시간에서 중요한 성장률에 집중할 수 있..
코딩 테스트 대비에 앞서 기본적인 자료 구조에 대해 학습하고자 한다.자료 구조 설명에 앞서, 해당 자료(링크)를 한번씩 읽어봤으면 좋겠다. 자료 구조에 대한 인사이트를 제공하는 포스트다.(자료 구조에 대한 원론적인 설명은 위 포스트로 대체한다.) 핵심 자료 구조 우리가 다룰 자료 구조는 자료형에 따라 크게 8개로 분류된다. Primitive Data Structure Primitive Data Structure은 프로그래밍에서 데이터를 저장하고 처리하는 가장 기본적인 형태의 구조를 의미한다. 이들은 프로그래밍 언어에 내장된 데이터 타입으로, 일반적으로 추가적인 추상화 없이 메모리에 직접적으로 저장되고 접근한다. Primitive Data Structure은 Integer(정수형), Float(실수형),..
딥러닝에 본격적인 학습에 앞서, 인공 신경망을 정리하지 않는다면 안될 것 같다.. Introduction 아래에 28 by 28 픽셀 데이터가 존재한다. 그리고 우리의 뇌는 이 이미지 데이터를 3이라고 인식한다. 그리고 아래의 경우에도 우리의 각 이미지에 밝기가 다름에도 불구하고 뇌는 아래 세개의 이미지 데이터를 각각 3으로 인식한다. 분명히 우리의 시각피질에서는 각 이미지 3에 대해 받아들이는 정보가 다름에도 불구하고 이를 모두 같은 3이라고 판단하며, 이와 마찬가지로 다른 개념을 가리키는 이미지들도 구별해낸다.(인간 뇌의 위대함이 아닐까 😲) 그러나 만약 아래와 같이 28 by 28개의 입력값을 받아 입력값만으로 숫자를 구분해보라고 한다면, 문제의 난이도는 엄청나게 올라갈 것이다. 그러나 이것은 기..
소위 말하는 딥러닝 구조를 쌓고 연산하기 위해선 텐서(Tensor) 구조에 대해서 선행적으로 알 필요가 있다. 오늘은 딥러닝에 중요한 개념인 텐서(Tensor)에 대해 정리해보고자 한다.(파이토치 기반으로 정리함을 참고하기 바란다!) 텐서(Tensor)의 기본 개념 텐서(Tensor)는 수학적인 개념으로 데이터의 배열이라고 생각하면 된다. 프로그래밍하는 사람들에게는 Numpy 배열이 익숙할 것인데, Numpy 배열과 똑같은 개념이 바로 Tensor라고 생각하면 된다. 텐서는 일반적으로 수치형 데이터를 저장하고 동적인 크기를 갖는다. 텐서(Tensor)의 구조 일반적인 텐서의 구조는 아래 그림과 같다. 여기에는 6차원 Tensor 구조까지 나와있는데, 차원은 게속적으로 높일 수 있는 듯하다. (다만, 시각..
차근차근 실습하며 배우는 파이토치 딥러닝이라는 책을 통해 파이토치를 공부하고 있는데 내가 두루뭉술하게만 알고 있었던 내용을 일목요연하게 정리해주는 내용이 있어 한번 정리해보고자 한다.(시험기간인데 너무 재밌어서 이것만 공부하고 있다.. 😭) 활성화 함수(Activation Function) 결론부터 말하자면 활성화 함수의 공통점은 모두 비선형 함수라는 것이다. 활성화 함수의 비선형성이 왜 필요할까를 생각하기 이전에, 우리가 생각하는 딥러닝 아키텍쳐에 대해 다시 한번 생각해보자. 우리는 흔히 딥러닝을 레고 블럭을 쌓는 것에 비유한다. 이 때 레고 블럭 하나하나를 층(layer)이라고 하며, 각각의 layer는 선형함수다. 이렇게 딥러닝에서 층을 쌓는 이유는 모델이 더 복잡하고 추상적인 표현을 학습할 ..
이번 프로젝트에서 Faiss 라이브러리를 사용해볼까 하여 Faiss에 대해 정리해보고자 한다. Faiss Faiss는 Facebook AI Research에서 개발한 라이브러리로 대량의 고차원 벡터에서 효율적인 유사성 검색 및 클러스터링을 처리를 위해 개발된 라이브러리다. 딥러닝에서는 복잡한 이미지, 텍스트, 사운드 데이터들을 벡터화하는 작업이 우선적으로 처리되어야 하는데 Faiss는 특히 딥러닝에서 생성된 대량의 벡터 데이터에 대한 연산을 처리하는데 최적화되어 있는 라이브러리이다. 딥러닝 문제를 해결함에 있어서 벡터 간 유사성을 찾는 상황이 일반적으로 많이 발생한다. 벡터 간 유사성을 찾는 방법으로 유클리드 거리나, 코사인 유사도 같은 방법을 사용할 수 있지만 이는 고차원&대용량 벡터 데이터로 넘어가..