본문 바로가기

분류 전체보기
[LLM] 2. 허깅페이스 트랜스포머 모델 학습하기 허깅페이스란?  2017년 트랜스포머 아키텍처가 세상에 공개된 이후, BERT와 GPT등 트랜스포머를 기반에 두면서도 구현 방식이 상이한 자연어 처리 모델들이 쏟아져 나왔다. 각 모델들의 활용법 또한 다르기 때문에, 사용자가 각 모델들의 활용법을 숙지하는 데 시간이 제법 소요되는 상황이 발생한 것. 이에 따라 각 모델의 개발/사용이 지연되기도 했다. 이러한 배경 속에서 Hugging face팀은 트랜스포머 라이브러리를 개발했는데, 쉬운 인터페이스로 트랜스포머 기반의 모델을 활용할 수 있도록 하였다. 이를 통해 우리는 트랜스포머 기반 모델을 손쉽게 사용할 수 있고, 심지어는 나만의 데이터로 학습시키는 것 또한 가능하다. (트랜스포머 기반 뿐만 아니라, 시중에 공개되어 있는 매우 다양한 종류의 딥러닝 모델을..
[LLM] 1. 임베딩, 어텐션, 트랜스포머 모델들 컴퓨터는 텍스트를 그대로 계산에 사용할 수 없다.그렇다면 어떻게 해야하는가 .. 텍스트를 적절한 단위로 자르고, 숫자로 변환하는 토큰화(tokenization) 과정이 필요하다.  input_text = "나는 최근 파리 여행을 다녀왔다"input_text_list = input_text.split()print("input_text_list: " , input_text_list)str2idx = {word:idx for idx, word in enumerate(input_text_list)}idx2str = {idx:word for idx, word in enumerate(input_text_list)}print("str2idx: ", str2idx)print("idx2str: ", idx2str)inp..
[C++] 객체지향 프로그래밍 - 클래스와 객체 (2) 객체와 멤버변수class Account{public: bool Withdraw(double amount) // 출금 { if (balance - amount  멤버 변수는 하나의 객체에 종속된 것이 아니다. 각 개체마다 독립된 멤버 변수를 사용한다.위 코드에서 kim_account, lee_account는 서로 다른 객체이기 때문에, 서로 독립된 balance를 갖는다.따라서 각각의 balance 값은 100, 200이 될 것이다.      멤버 변수를 클래스 밖에서 정의하기class Account{public: bool Deposit(double amount);private: std::string name; double balance = 0; };bool Account::Deposit(double a..
[C++] 객체지향 프로그래밍 - 클래스와 객체 절차적 프로그래밍이란?데이터와 작업(함수)가 분리되어 있는 개념즉, 데이터는 함수의 매개변수로 입력될 뿐이며 이후 함수의 동작에 의해 작업이 수행되어 output이 출력된다.굉장히 이해가 쉬운 방식이다.  절차적 프로그래밍의 단점어떤 함수에 모든 형식의 데이터가 입력될 수 있는 것이 아니다. 👉 func(int ~) 처럼, 함수에 입력될 수 있는 데이터의 형식이 지정되어 있다.따라서 함수가 데이터의 구조를 정확히 알고 있어야 하며, 데이터가 변하면 함수의 수정 또한 필요하다.이를 데이터와 함수가 Tightly coupled 되었다고 말하는데, 이는 함수의 재사용성을 낮추는 좋지 못한 특성이다. (loosely coupled한 프로그래밍을 작성하는 것이 좋다)이 경우 프로그램의 규모가 작을 때는 큰 문제..
[C++] 참조자 Reference 참조자란?변수가 아니다. 👉 변수는 메모리 공간을 차지한다. 하지만 참조자는 메모리 공간을 차지하지 않는 '변수의 별명' 이다. (엄청난 장점)선언과 동시에 반드시 초기화 되어야 한다. 👉 참조자는 Null 값을 가질 수 없다. 포인터의 경우에는 int* a; 처럼 초기화 하지 않은 선언이 가능했지만, 참조자의 경우에는 int& a=b; 처럼 반드시 변수를 입력해주어야 한다.Const pointer이면서, 사용시 자동으로 역참조를 수행함 👉 포인터의 편리한 버전이라고 생각하면 편하다.함수의 매개변수로 자주 사용 #include using namespace std;int main(){ int a = 10; int& b = a; b = 20; cout Error} 위 코드의 결과는 20포인터에서도 그..
[C++] 포인터를 함수에 input, return 포인터를 함수의 인자로 전달#include using namespace std;void double_data(int* int_ptr){ *int_ptr *= 2;}int main(){ int value = 10; cout  함수 double_data는 input 인자로 int* int_ptr을 받고 있다. 👉 어떤 변수의 주소인 포인터를 입력으로 받아 처리하는 함수를 생성하는 것이 가능하다.해당 함수 내부에서 *int_ptr *= 2; 👉포인터에 저장돼있는 변수에 역참조하여 실제 값을 2배 곱한다.    포인터의 Returnint* largest_int(int* int_ptr1, int* int_ptr2){ if (*int_ptr1 > *int_ptr2) return int_ptr1; else r..
[소켓프로그래밍] 6. 스레드 동기화 (임계 영역, 이벤트) 이 게시글은 'TCP/IP 윈도우 소켓 프로그래밍 (김선우 저, 한빛아카데미)'를 공부한 내용을 기반으로 작성됨 멀티스레드를 이용하는 경우, 두 개 이상의 스레드가 공유 데이터에 접근하면 여러 문제가 발생할 수 있다. 예를 들어 공유 변수 int money = 1000이 존재한다고 할 때, 스레드 #1이 money에 2000을 더하여 money = 3000이 되었다고 해보자. 이때 스레드 #2가 money = 3000이 되기 전에 이미 money를 read 해놓은 상태라고 해보자. 스레드 #2 입장에서는 money = 1000이기 때문에, 만약 이에 3000을 더해준다면 money = 4000이 된다. 이러한 상황이 발생하면 스레드 #1의 명령이 무시되는 것이므로, 오류로 볼 수 있다. 이러한 멀티스레드..
[소켓프로그래밍] 5. 스레드, 멀티스레드, 스레드 제어 이 게시글은 'TCP/IP 윈도우 소켓 프로그래밍 (김선우 저, 한빛아카데미)'를 공부한 내용을 기반으로 작성됨 직전 게시글에서 수행했던 TCP Server-Client 예제는 다음과 같은 문제를 갖는다. 여러 개의 Client가 Server에 접속하는 것은 가능하나, Server가 동시에 여러 Client에 서비스하는 것은 불가능하다. 예를 들어 두 개의 Client가 하나의 Server에 접속되어 있다면 먼저 접속한 Client가 Server에 전송한 메시지는 수신되지만, 늦게 접속한 Client가 전송한 메시지는 Server가 수신할 수 없다.이는 서버에 접속한 각 클라이언트들을 스레드를 이용하여 독립적으로 처리하여 해결한다. (멀티스레드)멀티스레드는 소켓 입출력 모델에 비해 비교적 쉽게 구현할 수..