0. AbstractAbstract 부분에서는 기존에 사용하던 fine-tuning과 저자들이 제시하는 prefix-tuning을 비교하고 있다.Fine-tuning→ downstream task를 처리하기 위해 전체 파라미터를 모두 학습해야 하며, 해당 모델을 저장할 때에도 모델 전체를 copy해야한다.Prefix-tuning→ Langauge model의 parameter들은 freeze한다. 대신 앞에 붙여지는 continuous task-specific vector를 optimize하는 방식이다. 이때 continous task-specific vector를 prefix라고 부른다. Prefix-tuning은 prompting에서 영감을 받았다고 한다. 이때 prompt와 관련된 의미들은 다음과 ..
분류 전체보기
1. IntroductionNLP를 다루는 많은 Application들은 매우 큰 PTLM을 여러 downstream task를 다루기 위해 adapting 방식을 사용했다. adaptation은 일반적으로 pre-trained model의 전체 파라미터를 update하는 fine-tuning을 사용했다. 하지만 점차 NLP에서 개발되는 모델들이 커지면서 이런 방법은 굉장히 비효율적이게 되었다. (GPT3만 봐도 175 billion개의 학습가능한 파라미터가 존재한다. 이를 모두 학습시킬려면 시간적으로도, 컴퓨팅 자원적으로도 비용이 굉장히 많이든다.) 따라서 위와 같은 fine-tuning 방식을 피하기 위해 몇 개의 파라미터만을 adapting하거나 외부 모듈을 학습하는 방식이 계속 연구되고 있다. (..
0. AbstractGPT, Bert와 같은 Large Language Model(LLM)을 Fine-tuning하는 것은 굉장히 효과적인 transfer mechanism이지만, fine-tuning은 많은 downstream task들에 대해 파라미터적으로 비효율적이다. (모든 테스크에 대해 항상 전체 모델을 다시 학습시켜야하기 때문이다. 즉, 모든 파라미터를 다시 학습시킨다.)이에 대한 대안으로 논문 저자들은 adapter module을 통해 transfer하는 방법을 제시하고 있다. Adapter module은 compact하고 extensible한 모델을 생성할 수 있다. 각각의 의미는 다음과 같다. Compact Model: 작업마다 조금의 파라미터만을 추가해 문제를 해결하는 모델이다.Exte..
해당 문제는 아래와 같은 알고리즘으로 풀이했다.입력받은 수식을 문자열로 저장하고, 문자 하나씩 탐색한다.피연산자의 경우 해당 피연산자에 해당하는 값으로 변환하여 리스트에 순서대로 저장한다. (값으로 변환하기 위해 values 리스트를 사용하고, 해당 값들은 stack에 담긴다.)만약 연산자를 만나는 경우, stack에서 두 값을 꺼내고 해당 연산자에 해당하는 연산을 수행한다.코드는 다음과 같다.import sysinput = sys.stdin.readlinen = int(input())formula = input().rstrip()values = list()stack = list()for i in range(n): values.append(int(input()))for i in formula: ..
해당 문제는 이전에 풀었던 오큰수(17298)과 비슷한 문제다. 단지 while문의 조건만 바꾸어주면 된다. 알고리즘은 다음과 같다.결과를 담을 리스트를 선언한다. 이때 원소들은 모두 -1을 가진다. (result list)각 원소가 몇 번 나왔는지 카운트한 숫자를 담은 dict를 선언한다. (count_dict) 단, 현재 코드에서는 defaultdict를 사용했지만, 그냥 (모든 원소가 0인) 100만까지의 숫자를 담을 수 있는 리스트를 선언해도 된다.stack은 아직 자기보다 많이 나온 수를 찾지 못한 원소들의 인덱스를 담는다. 0번째 인덱스부터 탐색해야하므로 0을 담고 시작한다.반복문을 통해 1번~n-1번 인덱스까지 탐색한다. (탐색 중인 원소를 current_value[=array[i]]라고 하..
해당 문제는 다음과 같은 알고리즘으로 풀이했다.결과를 담을 리스트를 선언한다. 이때 원소들은 모두 -1을 가진다. (result list)stack은 아직 자기보다 큰 수를 찾지 못한 원소들의 인덱스를 담는다. 0번째 인덱스부터 탐색해야하므로 0을 담고 시작한다.반복문을 통해 1번~n-1번 인덱스까지 탐색한다. (탐색 중인 원소를 current_value[=array[i]]라고 하자.)stack에 남아있는 원소가 있고(자기보다 큰 수를 찾지 못한 원소가 있고), 그 원소들 중 가장 오른쪽의 원소와 current_value를 비교했을 때 current_value가 더 크다면, stack에서 가장 오른쪽의 원소를 빼내고, 해당 원소의 NGE값은 current_value로 설정한다. 해당 코드는 다음과 같다...
해당 문제는 다음과 같은 알고리즘으로 풀이했다.레이저는 ()로 표시되어 있다. 따라서 ()부분을 모두 문자 L로 바꾼다. (.replace() 메서드 사용)주어진 문자열(formula)를 탐색한다. 이때 '('부분은 막대가 시작하는 부분으로 막대가 시작하는 부분이 나오면 num_stick에 1을 더해준다. (num_stick은 현재 구간에 있는 막대 개수다.)문자열 탐색 도중 ')'를 만난다면 가장 짧은 막대기 하나가 끝나는 부분이다. 따라서 num_stick에 -1을 해주고, 지금까지 세어준 막대기(result)에 +1을 한다.만약 'L'을 만나면 result에 num_stick을 더해주면 된다. (현재 구간에 쌓여있는 막대 개수만큼 레이저로 잘리기 때문이다.)코드는 다음과 같다.formula = in..
17413번: 단어 뒤집기 2 문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('')로만 이루어져 www.acmicpc.net 처음에는 해당 문제를 collections 라이브러리의 deque 자료구조를 활용해서 풀었다. 알고리즘은 다음과 같다. 먼저 입력 받은 문자열을 리스트로 변환한다. (리스트로 변환하면 문자열의 각 문자가 원소로 리스트에 들어간다. 예를 들어, "abc" 문자열은 ['a', 'b', 'c']로 들어간다.) 만약 첫 번째 원소가 ''가 나올 때까지 문자를 합쳐준다. '>'가 나온 경우 탐색을 멈추고 태그 내용을 출력한다. 만약 첫 번째..