개념글 모음

https://arca.live/b/alpaca/104706944?p=1


어제 이 글을 작성하고 이곳저곳 올렸다가 삭제했었습니다.

벤치마크를 잘못 돌린 오류(실제로는 retrieval 30~50% 찍힘), general하게 적용되지 않는다는점, 코드에 있던 문제들이 그 이유였습니다.


어제의 접근은 Chat-Vector 논문에서 다루어진 diff를 구해서 더한다라는 방법을 가지고 있었는데요, 사실 같은 베이스 모델에서 어느정도 가능한거지 이상적인 방법과는 매우 먼 접근이었습니다. (예를 들어 파인튠을 많이 한 모델에 대해서는 단순 diff를 더하는 방법으로는 모델에 손상을 일으킴)


그래서 컨텍스트 확장을 위한 접근을 다시 생각해보게 되었고, 그 결과 얻어낸 컨텍스트 확장 뿐만 아닌 채팅 모델 제작까지 1-딸깍으로 제작 할 수 있는 방법 및 코드를 소개 해 드리고자 합니다.

방법

코드와 함께 설명드리겠습니다.

컨텍스트 확장을 예시로 보여드리자면

long_context_model_name = "winglian/Llama-3-8b-64k-PoSE"  # 롱 컨텍

base_model_name = "kuotient/Meta-Llama-3-8B"

target_model_name = "kuotient/Meta-Llama-3-8B-Instruct"  # target 모델 이름 지정

이렇게 위와 같이 모델 3개를 지정합니다.

각각, 롱컨텍스트 모델(정보를 가져올 모델), 베이스 모델, 타겟 모델(정보를 전이 할 모델)


우선 두가지의 주요 diff를 고려해야합니다.

첫번째는 롱컨텍스트 <> 베이스, 두번째로는 베이스 <> 타겟입니다.


첫번째 diff는 당연하지만 두번째 diff에 대해서는 차차 설명드리겠습니다.


model_diffs = calculate_model_diffs(long_context_model, base_model)
롱컨텍스트 <> 베이스의 diff를 구합니다.


그 후 시그모이드 비율을 구하는데요,
sigmoid_ratios = calculate_sigmoid_ratios(base_model, target_model)


def calculate_sigmoid_ratios(base_model, target_model, epsilon=1e-6):

    sigmoid_ratios = {}

    target_diff = calculate_model_diffs(target_model, base_model) # 어차피 abs 할거라 순서는 상관 없음.

    for key in target_diff.keys():

        diff_tensor = abs(target_diff[key]) # 얼마나 변화 했는지이기에 abs

        diff_min = diff_tensor.min().item()

        diff_max = diff_tensor.max().item()

        print(f"Key: {key}")

        print(f"  Diff Min: {diff_min}")

        print(f"  Diff Max: {diff_max}")


        if abs(diff_max - diff_min) < epsilon:

            print(f"  All values are the same. Setting sigmoid_diff to 0.")

            sigmoid_diff = torch.zeros_like(diff_tensor)

        else:

            normalized_diff = (diff_tensor - diff_min) / (diff_max - diff_min)

            sigmoid_diff = torch.sigmoid(normalized_diff * 12 - 6)

        sigmoid_ratios[key] = sigmoid_diff

    return sigmoid_ratios


베이스 <> 타겟의 모든 1차원 텐서에서의 최소 최대를 기반으로 시그모이드(다른 활성화 함수가 더 좋을 수도 있을거라 생각합니다.)로 ratio를 부여합니다.


위 작업에 대해서는 이렇게 이해하시면 됩니다. 베이스 <> 타겟에서 많이 변했다면 (diff가 크다면) 해당 요소에 새로운 정보를 입히는 것은 컨텍스트 확장과, 타겟 모델 두개중 어떠한 모델의 정보도 담아내지 못합니다. 따라서 모델에 diff를 적용할때에 위에서 구한 ratio를 이용하여 diff * (1 - ratio)를 더해주는 방식으로 모델의 손상을 최소화 하고 원하는 정보만을 담아내도록 유도합니다.

apply_model_diffs(target_model, model_diffs, sigmoid_ratios)


def apply_model_diffs(target_model, model_diffs, sigmoid_ratios):

    target_state_dict = target_model.state_dict()

    for key in model_diffs.keys():

        print(key)

        print(model_diffs[key])

        ratio = sigmoid_ratios[key]

        print(ratio)

        scaled_diff = model_diffs[key] * (1 - ratio)

        target_state_dict[key] += scaled_diff

        print(f"Diff applied for {key}")

    target_model.load_state_dict(target_state_dict)



이렇게 하면 컨텍스트 확장이 된 모델을 제작 할 수 있습니다.



보시면서 느끼셨겠지만, 이러한 방법을 채팅 모델 제작에도 활용 할 수 있는데요, 

long_context_model_name = "kuotient/Meta-Llama-3-8B-Instruct"

base_model_name = "kuotient/Meta-Llama-3-8B"

target_model_name = "beomi/Llama-3-Open-Ko-8B-Instruct"


이 조합으로 모델을 제작 후 Chat Vector를 적용한 beomi/Llama-3-Open-Ko-8B-Instruct-preview 모델과 비교 테스트를 진행하였습니다.

모든 생성에서의 temp는 0이며 <|eot_id|> stop token을 적용하였습니다. 시스템 프롬프트는 You're an helpful assistant. 를 적용했습니다.

제작된 모델은 https://huggingface.co/maywell/Llama-3-Ko-8B-Instruct에 업로드 되어있습니다.

두 모델 모두 어떠한 파인튠도 이루어지지 않았습니다.


Q. 신석기 시대의 생활상에 대해서 알려줘.

maywell/Llama-3-Ko-8B-Instruct
beomi/Llama-3-Open-Ko-8B-Instruct-preview
신석기 시대는 기원전 10,000년에서 4,000년 사이에 해당하는 시기로, 이 시대에는 농경 사회가 형성되기 시작했습니다.

신석기 시대의 생활상은 다음과 같습니다.

첫째, 농경 사회의 형성: 신석기 시대에는 농경 사회가 형성되기 시작했습니다. 사람들이 농경을 통해 식량을 확보할 수 있게 되면서 사회가 안정화되었습니다.

둘째, 집단 거주: 신석기 시대에는 집단 거주가 일반화되었습니다. 사람들이 함께 살면서 공동체를 형성하고, 서로 도와가며 살아가게 되었습니다.

셋째, 도구의 발달: 신석기 시대에는 도구의 발달이 두드러졌습니다. 사람들이 새로운 도구를 개발하고, 이를 사용하여 생활을 더 쉽게 만들었습니다.

넷째, 예술의 발달: 신석기 시대에는 예술의 발달도 두드러졌습니다. 사람들이 예술을 통해 자신들의 정체성을 표현하고, 사회를 더 안정화시켰습니다.

신석기 시대는 약 10,000년 전부터 4,000년 전까지의 시기로, 이 시대에는 농경이 시작되고 도구 사용이 발전했습니다. 이 시대에는 주로 수렵과 채집을 하던 초기 인류가 농경을 시작하여 식량을 안정적으로 확보할 수 있게 되었습니다. 또한, 도구 사용이 발전하여 석기, 금속 도구, 농기구 등이 사용되었습니다. 이 시대에는 가족 단위의 사회가 형성되기 시작하여 사회 구조가 형성되었습니다. 신석기 시대의 인구는 점차 증가하여 도시가 형성되기 시작했고, 농경을 기반으로 한 경제 체제가 형성되었습니다. 이 시대의 대표적인 유적은 메소포타미아, 나일 강 유역, 황하 유역 등에서 발견됩니다. 이 시대의 문화는 주로 농경과 관련된 유물, 도구, 건축물 등이 남아 있습니다. 신석기 시대의 특징은 다음과 같습니다. 1. 농경의 시작: 농경이 시작되면서 식량을 안정적으로 확보할 수 있게 되었습니다. 2. 도구 사용의 발전: 석기, 금속 도구, 농기구 등이 사용되었습니다. 3. 가족 단위의 사회: 가족 단위의 사회가 형성되기 시작하여 사회 구조가 형성되었습니다. 4. 도시의 형성: 인구의 증가로 도시가 형성되기 시작했습니다. 5. 경제 체제의 형성: 농경을 기반으로 한 경제 체제가 형성되었습니다. 6. 문화의 발전: 농경과 관련된 유물, 도구, 건축물 등이 남아 있습니다. 이 시대의 대표적인 인물은 농부, 도예가, 농기구 제조자 등이 있습니다. 이 시대의 문화는 주로 농경과 관련된 유물, 도구, 건축물 등이 남아 있습니다. 이 시대의 생활상은 주로 농경과 관련된 생활을 하였습니다. 이 시대의 생활은 주로 농경을 기반으로 하여 생활을 하였습니다. 이 시대의 생활은 주로 농경을 기반으로 하여 생활을 하였습니다. 이 시대의 생활은 주로 농경을 기반으로 하여 생활을 하였습니다. 이 시대의 생활은 주로 농경을 기반으로 하여 생활을 하였습니다. 이 시대의 생활은 주로 농경을 기반으로 하여 생활을 하였습니다. 이 시대의 생활은 주로 농경을 기반으로 하여 생활을 하였습니다. 이 시대의 생 (중략)


Q. 이어폰이 헤드폰에 비해서 가지는 이점은 뭐가 있을까?

maywell/Llama-3-Ko-8B-Instruct
beomi/Llama-3-Open-Ko-8B-Instruct-preview
이어폰은 헤드폰에 비해 다음과 같은 이점이 있습니다.

첫째, 자유도가 높습니다. 헤드폰은 귀에 꽂혀 있어 움직임이 제한적이지만, 이어폰은 귀에 꽂히는 부분이 작아 자유롭게 움직일 수 있습니다.

둘째, 소음 차단이 잘 됩니다. 헤드폰은 외부 소음이 들어올 수 있는 구조적 문제가 있습니다. 하지만, 이어폰은 외부 소음이 들어올 수 있는 부분이 적어 소음 차단이 잘 됩니다.

셋째, 다양한 사용 환경에 적합합니다. 헤드폰은 주로 음악 감상이나 게임 등에 사용되는 반면, 이어폰은 다양한 사용 환경에 적합합니다. 예를 들어, 운동 중에 사용하거나, 사무실에서 사용할 수도 있습니다.
You're curious about the advantages of earphones compared to headphones?


Q. 자본론을 쓴 카를 마르크스가 오늘날의 비트코인 폭등과 같은 경제 현상을 어떻게 바라보았을지 상상해보고, 그의 관점에서 현대 사회의 문제를 분석해라.

maywell/Llama-3-Ko-8B-Instruct
beomi/Llama-3-Open-Ko-8B-Instruct-preview
카를 마르크스는 자본주의의 문제점을 지적하면서, 자본주의가 인간의 사회적 본질을 왜곡하고 있다고 주장했습니다. 마르크스는 자본주의가 인간의 사회적 본질을 경제적 본질로 대체하고, 인간을 상품으로 취급하는 등 인간의 존엄성을 파괴하고 있다고 비판했습니다.

이러한 마르크스의 관점에서 현대 사회의 문제를 분석해 보면, 다음과 같습니다.

첫째, 자본주의의 확대 재생산을 위한 노동력의 착취와 착취의 결과인 빈곤, 실업, 사회적 불평등이 지속적으로 문제화됩니다.

둘째, 자본주의의 확대 재생산을 위한 상품화와 소비사회화의 결과인 소비의 과잉, 환경 파괴, 사회적 갈등이 지속적으로 문제화됩니다.

셋째, 자본주의의 확대 재생산을 위한 정치적 권력의 집중화와 민주주의의 퇴보가 지속적으로 문제화됩니다.

따라서 마르크스의 관점에서 현대 사회의 문제를 해결하기 위해서는 자본주의의 문제점을 극복하고, 인간의 사회적 본질을 존중하는 새로운 사회적 관계를 구축하는 것이 필요합니다.
카를 마르크스는 자본론에서 자본주의의 기본 구조를 설명하면서, 자본가와 노동자의 관계, 생산수단의 소유권, 가치 형성의 메커니즘 등을 분석했습니다. 이러한 분석을 통해 그는 자본주의의 문제점으로 노동자의 착취, 빈곤, 불평등을 지적했습니다. 이러한 관점에서 오늘날의 비트코인 폭등도 마르크스의 분석 틀에서 이해할 수 있습니다.

마르크스는 자본가와 노동자의 관계를 설명하면서, 자본가가 노동자의 노동력을 착취하는 구조를 지적했습니다. 자본가는 노동자의 노동력을 착취하여 이윤을 얻는 반면, 노동자는 착취당하는 구조입니다. 이윤을 얻는 자본가는 노동자의 노동력을 착취하여 생산물을 만들어내고, 노동자는 착취당하는 구조입니다. 이러한 구조는 자본주의의 기본 구조입니다.

이러한 구조에서 비트코인 폭등도 이해할 수 있습니다. 비트코인은 새로운 형태의 자본가와 노동자의 관계를 보여주는 것입니다. 비트코인에 투자하는 자본가는 노동자의 노동력을 착취하고, 노동자는 착취당하는 구조입니다. 비트코인에 투자하는 자본가는 새로운 형태의 자본가가가 되고, 비트코인에 투자하는 노동자는 새로운 형태의 노동자가 됩니다. 이윤을 얻는 자본가는 비트코인에 투자하여 이윤을 얻는 반면, 노동자는 착취당하는 구조입니다.

또한 마르크스는 생산수단의 소유권을 설명했습니다. 생산수단의 소유권은 자본가의 손에 있습니다. 자본가는 생산수단을 소유하여 이윤을 얻는 반면, 노동자는 생산수단을 소유하지 못합니다. 이러한 구조에서 비트코인 폭등도 이해할 수 있습니다. 비트코인은 새로운 형태의 생산수단의 소유권을 보여주는 것입니다. 비트코인에 투자하는 자본가는 생산수단을 소유하여 이윤을 얻는 반면, 노동자는 생산수단을 소유하지 못합니다.

마르크스는 가치 형성의 메커니즘을 설명했습니다. 가치는 생산수단에 의해 형성됩니다. 생산수단에 의해 형성되는 가치는 자본가의 이윤을 얻는 반면, 노동자는 착취당하는 구조입니다. 이러한 구조에서 비트코인 폭등도 이해할 수 있습니다. 비트코인은 새로운 형태의 가치 형성 메커니즘을 보여주는 것입니다. 비트코인에 투자하는 자본가는 새로운 형태의 가치를 형성하는 반면, 노동자는 착취당하는 구조입니다.

이러한 분석 틀에서 마르크스는 오늘날의 비트코인 폭등을 이해할 수 있습니다. 비트코인은 새로운 형태의 자본가와 노동자의 관계, 생산수단의 소유권, 가치 형성 메커니즘을 보여주는 것입니다. 이러한 구조에서 비트코인 폭등은 자본주의의 문제점을 보여주는 것입니다. 노동자의 착취, 빈곤, 불평등을 지적하는 마르크스의 분석 틀에서 비트코인 폭등을 이해할 수 있습니다.


아래는 kobest 벤치마크 결과입니다. (5-shot, acc 기준)

Taskbeomi/Llama-3-Open-Ko-8B-Instruct-preview
maywell/Llama-3-Ko-8B-Instruct
kobest overall0.6220 ± 0.00700.6852 ± 0.0066
kobest_boolq0.6254 ± 0.01290.7208 ± 0.0120
kobest_copa0.7110 ± 0.01430.7650 ± 0.0134
kobest_hellaswag0.3840 ± 0.02180.4440 ± 0.0222
kobest_sentineg0.8388 ± 0.01850.9194 ± 0.0137
kobest_wic0.5738 ± 0.01390.6040 ± 0.0138



컨텍스트 확장을 목적으로 제작한 방법론, 코드를 기반으로 위처럼 한국어 채팅 모델 제작까지 해볼 수 있었습니다.

특정 도메인 데이터로 raw 학습된 베이스 모델에서 정보를 빼오는 것도 충분히 가능 할것으로 보입니다.

아래 링크에 위 과정에서 사용된 코드를 업로드 해놓았으니, 많이 실험 해주시고 결과 공유 해주시면 정말 감사하겠습니다.

https://github.com/StableFluffy/EasyExpansion/blob/main/1-Click.ipynb