전체 글 82

[자연어처리 CS224N] #2-2. Skip-gram with Negative Sampling

지난 포스팅에서 우리는 Word2vec의 손실함수를 Optimization 하는 과정에 대해 배웠다. (참조 2024.03.19 - [자연어처리] - [자연어처리 CS224N] #2-1. Word2Vec Optimization (SGD)) 그런데 지난 글에서 알아본 바로는 우리는 cross entropy 연산을 통해 구한 오차로부터 임베딩 테이블에 있는 모든 단어에 대한 임베딩 벡터 값을 업데이트 한다고 했다. 단어 집합의 크기가 매우 크다면 이 작업은 굉장히 오랜 시간이 걸릴 것이다. 크게 중요하지 않은 계산까지도 모두 거쳐야 하기 때문에 연산량이 매우 많고 비효율적이다. 그래서 이를 해결하기 위해 negative sampling을 사용한다. 이 방법은 Word2vec이 학습 과정에서 전체 단어 집합이..

자연어처리 2024.03.24

[운영체제] 16. segmentation 세그멘테이션

지금까지 메모리 가상화가 필요한 이유와 목적, 가상화를 하기 위한 동적 재배치 방법에 대해 알아보았다. 동적 재배치는 베이스/바운드 방식을 이용했다. 그런데 주소 공간에서 스택과 힙 사이에 사용되지 않는 빈 공간이 존재하는 것을 보았을 것이다. 그 사이의 빈 공간은 사용되지 않더라도 재배치할 때 물리 메모리를 차지한다. 따라서 메모리 낭비가 심하고, 주소 공간이 물리 메모리보다 크면 실행할 수 없다. 이러한 측면에서 베이스/바운드 방식은 유연성이 없다. 이를 해결하기 위해 등장한 아이디어가 세그멘테이션(segmentaition)이다. 16.1 세그멘테이션: 베이스/바운드(base/bound)의 일반화 이 아이디어는 MMU안에 오직 하나의 베이스/바운드 쌍만 존재하는 것이 아니라 주소 공간의 논리적인 세그..

운영체제 2024.03.24

[운영체제] 15. vm mechanism 주소 변환의 원리

앞서 메모리 가상화가 필요한 이유와 목표에 대해 살펴보았다. 그렇다면 어떻게 효율적이고 유연하게 메모리를 가상화할 수 있을까? 우리가 다룰 기법은 하드웨어 기반 주소 변환(hardware-based address translation), 짧게 말해서 주소 변환(address translation)이다. 하드웨어는 주소 변환을 통해 Load, Store, Fetch 등의 가상 주소를 실제 존재하는 물리 주소로 변환한다. 하지만 하드웨어만으로 메모리 가상화를 구현할 수는 없다. 운영체제가 관여한다. 15.1 가정 몇 가지 비현실적인 가정을 설정하고 시작해보자. 사용자 주소 공간은 물리 메모리에 연속적으로 배치되어야 하며, 주소 공간의 크기는 물리 메모리보다 작고, 각 주소 공간의 크기는 같다. 이렇게 가정하..

운영체제 2024.03.24

[운영체제] 13. Address Space 주소 공간

13.1 초기 시스템 초기의 시스템의 메모리는 매우 단순했다. 0~64KB의 메모리를 운영체제가 사용했고, 나머지 메모리는 하나의 실행 중인 프로그램(프로세스)가 사용했다. 13.2 멀티 프로그래밍과 시분할 하지만 컴퓨터를 더 효과적으로 사용하기 위해 멀티 프로그래밍(multi-programming)이 등장했다. 멀티 프로그래밍이란 하나의 CPU를 가지고 작업하던 중 어느 프로세스가 I/O 처리를 하게 되었을 때, 그 입출력 결과를 무한히 기다리는 대신 다음 프로세스 작업을 진행하는 것이다. 준비 상태에 있는 프로세스로 전환하는 것은 운영체제의 몫이다. 따라서 CPU의 이용률이 늘어나게 되었다. 그 이후 시분할(time-sharing) 방식도 도입되었다. 시분할을 구현하는 한 가지 방법은 하나의 프로세스..

운영체제 2024.03.23

[자연어처리 CS224N] #2-1. Word2Vec Optimization (SGD)

지난 포스팅에서 우리는 Word2vec으로 워드 임베딩을 하기 위한 손실 함수를 구했다. 우리가 학습해야 하는 벡터들(u,v)은 다 파라미터이다. 우리가 가진 목적 함수 J(θ)를 최소화 하기 위해서는 경사하강법(gradient descent)이라는 알고리즘을 사용한다. 경사하강법이란 J(θ)의 gradient를 계산해서, 기울기가 작아지는 방향으로 조금씩 나아가는 것이다. 우리는 u와 v를 이용해서 목적 함수를 만들었으므로 이 목적 함수를 최소화하는 파라미터를 찾는다면, 워드 임베딩이 잘 된 것이라고 할 수 있을 것이다. 아래 식을 보자. θ new 를 구하기 위해서는 θ old에서 (J(θ)를 편미분한 값 * α)를 빼주면 된다. α는 step size 혹은 learning rate라고 한다. 이는 ..

자연어처리 2024.03.19

[자연어처리 CS224N] #1. Introduction and Word Vectors

하하 나는 인공지능을 많이 공부해보지 않아서 잘 모르는데... 어쩌다보니 자연어처리 수업을 듣게 됐다. 최대한 이해하려고 부여잡으면서 열심히 해볼게... cs224n 강의자료를 활용하였고, 국민대학교 김장호 교수님의 강의를 듣고 정리한 글입니다. 공부하며 정리한 글이기에 오류가 매우매우 많을 수 있음을 밝힙니다. 우리는 단어를 어떻게 표현하는가? 단어에 대한 일반적인 언어의 사고방식은 denotational segmantics이다. 이는 '표의적(표시적) 의미론'이라고 한다. 우리는 '나무'라고 하면 자연스럽게 나무의 이미지가 떠오른다. 근데 컴퓨터는 어떻게 의미를 알지? 예전에 사용되던 방식은 WordNet 이었다. WordNet은 동의어(synonym sets)와 상의어(hypernyms)를 포함한 ..

자연어처리 2024.03.11

[Boj] 백준 C++ #2981 검문

https://www.acmicpc.net/problem/2981 2981번: 검문 트럭을 타고 이동하던 상근이는 경찰의 검문을 받게 되었다. 경찰은 상근이가 운반하던 화물을 하나하나 모두 확인할 것이기 때문에, 검문하는데 엄청나게 오랜 시간이 걸린다. 상근이는 시간 www.acmicpc.net #include #include using namespace std; int gcd(int a, int b){ //유클리드 호제법을 이용한 최대공약수 구하기 알고리즘 if(a

Boj 2024.01.10

[Boj] 백준 C++ #1991 트리 순회

https://www.acmicpc.net/problem/1991 1991번: 트리 순회 첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파 www.acmicpc.net #include using namespace std; static int tree[26][2]; void preOrder(int now){ // 전위 순회 if(now == -1) return; cout>right; int rootInt, leftInt, rightInt; rootInt = root - 'A'; // 'A'는 0으로, 'B'는 1로, ... 'Z'는 25로 변환하여 숫자..

Boj 2024.01.05

[Boj] 백준 C++ #13241 최소공배수

문제 정수 B에 0보다 큰 정수인 N을 곱해 정수 A를 만들 수 있다면, A는 B의 배수이다. 당신은 두 수에 대하여 최소공배수를 구하는 프로그램을 작성 하는 것이 목표이다. 입력 한 줄에 두 정수 A와 B가 공백으로 분리되어 주어진다. 50%의 입력 중 A와 B는 1000(103)보다 작다. 다른 50%의 입력은 1000보다 크고 100000000(108)보다 작다. 추가: 큰 수 입력에 대하여 변수를 64비트 정수로 선언하시오. C/C++에서는 long long int를 사용하고, Java에서는 long을 사용하시오. 출력 A와 B의 최소공배수를 한 줄에 출력한다. #include using namespace std; int gcd(long long int a, long long int b){ // ..

Boj 2023.12.28

[Boj] 백준 C++ #3036 링

문제 상근이는 창고에서 링 N개를 발견했다. 상근이는 각각의 링이 앞에 있는 링과 뒤에 있는 링과 접하도록 바닥에 내려놓았다. 상근이는 첫 번째 링을 돌리기 시작했고, 나머지 링도 같이 돌아간다는 사실을 발견했다. 나머지 링은 첫 번째 링 보다 빠르게 돌아가기도 했고, 느리게 돌아가기도 했다. 이렇게 링을 돌리다 보니 첫 번째 링을 한 바퀴 돌리면, 나머지 링은 몇 바퀴 도는지 궁금해졌다. 링의 반지름이 주어진다. 이때, 첫 번째 링을 한 바퀴 돌리면, 나머지 링은 몇 바퀴 돌아가는지 구하는 프로그램을 작성하시오. 입력 첫째 줄에 링의 개수 N이 주어진다. (3 ≤ N ≤ 100) 다음 줄에는 링의 반지름이 상근이가 바닥에 놓은 순서대로 주어진다. 반지름은 1과 1000를 포함하는 사이의 자연수이다. 출..

Boj 2023.12.23