실습형 딥러닝-pytorch 버전(1): 소개 및 사전 준비

참고자료

0. 환경설치

1. 소개

  • 머신러닝(ML)은 경험을 통해 학습 할 수 있는 강력한 기술 클래스입니다 . 일반적으로 관찰 데이터 또는 환경과의 상호 작용 형태로 기계 학습 알고리즘은 더 많은 경험을 축적하고 성능이 점차 향상됩니다.

1.1 일상생활에서의 머신러닝

  • "Alexa"와 같은 "깨어나는 단어"에 응답하는 프로그램을 작성해야 하는 경우

    • 다수의 오디오 샘플이 포함된 데이터세트를 수집 하고 깨우기 단어 유무에 관계없이 샘플에 라벨을 지정합니다.
    • 기계 학습 알고리즘을 사용하면 깨우기 단어를 "명시적으로" 인식하는 시스템을 설계하는 대신 출력이 여러 매개 변수(매개 변수)에 의해 결정되는 유연한 프로그램 알고리즘을 정의한 다음 데이터 세트를 사용하여 현재 " 최고의 깨우기 단어 " . 최적의 매개변수 세트" 는 일부 성능 측정을 통해 작업에 대한 최상의 성능을 달성합니다.
    • 매개변수란 무엇입니까?
      • 매개변수가 조정된 모든 프로그램을 모델이라고 합니다 . 매개변수를 조작하여 생성된 모든 다양한 프로그램(입출력 매핑)의 모음을 "모델 패밀리"라고 합니다. 데이터 세트를 사용하여 매개변수를 선택하는 메타 프로그램을 학습 알고리즘이라고 합니다.
    • 문제를 정확하게 정의하고, 입력 및 출력의 특성을 결정하고, 적절한 모델군을 선택해야 합니다. 이 예에서 모델은 오디오를 입력으로 수신하고 출력으로 예 또는 아니요 중에서 선택합니다.
      • 완전히 다른 입력 또는 출력을 처리하려는 경우(예: 이미지에서 자막으로 매핑 또는 영어에서 중국어로 매핑) 완전히 다른 모델 제품군이 필요할 수 있습니다.
  • 기계 학습에서 학습은 모델을 훈련하는 과정입니다 . 이 프로세스를 통해 올바른 매개변수 세트를 발견하여 모델이 원하는 동작을 시행할 수 있습니다. 즉, 데이터를 사용하여 모델을 훈련합니다 . 훈련 과정에는 일반적으로 다음 단계가 포함됩니다.

    • (1) 기본적으로 "지능"이 없는 임의의 초기화 매개변수가 있는 모델로 시작합니다.
    • (2) 일부 데이터 샘플을 가져옵니다(예: 오디오 클립 및 해당 예 또는 아니요 레이블).
    • (3) 이 샘플에서 모델의 성능이 향상되도록 매개변수를 조정합니다.
    • (4) 모델이 작업을 만족스럽게 수행할 때까지 (2)와 (3) 단계를 반복합니다.

1.2 기계 학습의 주요 구성 요소

1.2.1 데이터(데이터)

  • 각 데이터 세트는 표본으로 구성되며 , 대부분 독립적이고 동일한 분포를 따릅니다. 샘플은 데이터 포인트 또는 데이터 인스턴스라고도 하며 일반적으로 각 샘플은 기계 학습 모델이 예측을 수행하는 기능 또는 공변량이라는 속성 세트로 구성됩니다 . 특별한 속성을 예측해야 한다고 가정하면 이를 레이블(레이블 또는 대상(target))이라고 합니다.

    • 이미지 데이터로 작업할 때 각 개별 사진은 각 픽셀에 대한 값의 정렬된 목록으로 특징이 표현되는 샘플입니다.
  • 각 샘플의 특징 카테고리 수가 동일할 때 해당 특징 벡터는 고정된 길이가 되며, 이를 데이터의 차원이라고 합니다. 그러나 모든 데이터가 "고정 길이" 벡터로 표현될 수 있는 것은 아니며, 기존 기계 학습 방법에 비해 딥 러닝의 주요 장점은 다양한 길이의 데이터를 처리할 수 있다는 것입니다.

  • 더 많은 데이터를 사용하면 더 강력한 모델을 훈련할 수 있습니다. 많은 양의 데이터를 갖는 것만으로는 충분하지 않지만 올바른 데이터도 필요합니다 . 데이터에 오류가 가득하거나 데이터의 특성이 작업 목표를 예측하지 못하는 경우 모델이 유효하지 않을 가능성이 높습니다.

    • 예를 들어, 치료와 관련된 훈련 데이터 세트에서 피부암 인식 모델을 훈련시키고 싶지만 훈련 데이터 세트에서 검은 피부를 가진 사람을 "본" 적이 없다면 모델은 갑자기 무력해질 것입니다.
    • 데이터가 충분히 대표성이 없거나 일부 사회적 편견을 포함하는 경우 모델이 편향될 가능성이 높습니다.

1.2.2 모델

  • 대부분의 기계 학습에는 데이터 변환이 포함됩니다.
    • 예를 들어, "사진을 찍어 웃는 얼굴을 예측하는 시스템"
    • 또 다른 예는 수집된 센서 판독값 세트를 통해 판독값의 정상성과 비정상성을 예측하는 것입니다.

    딥러닝과 고전적 방법의 주요 차이점은 전자는 계층별 데이터 변환을 포함하여 신경망으로 복잡하게 얽혀 있는 강력한 모델에 중점을 두기 때문에 딥러닝이라고 불린다는 것입니다.

1.2.3 목적 함수

  • 머신러닝에서는 모델의 품질을 측정하는 척도를 정의해야 하는데, 이 척도는 대부분의 경우 '최적화 가능'하며 이를 목적함수(obiective function)라고 합니다. 목적 함수를 정의하고 이를 가능한 가장 낮은 지점까지 최적화하려는 것이 일반적입니다. 낮을수록 좋기 때문에 이러한 함수를 손실 함수(손실 함수 또는 비용 함수)라고도 합니다.

    • 작업이 값을 예측 하려고 할 때 가장 일반적인 손실 함수는 예측 값과 실제 값 간의 차이의 제곱인 오차 제곱(제곱 오류) 입니다.
    • 분류 문제를 해결하려고 할 때 가장 일반적인 목적 함수는 오류율 , 즉 예측이 실제 상황과 일치하지 않는 샘플의 비율을 최소화하는 것입니다.
    • 오류율과 같은 일부 목표는 미분성 또는 기타 복잡성으로 인해 직접 최적화하기 어렵고, 이 경우 대체 목표가 종종 최적화됩니다.
  • 일반적으로 손실 함수는 모델 매개변수로 정의되며 데이터세트에 따라 달라집니다. 데이터 세트에서 총 손실을 최소화하여 모델 매개변수의 최적 값을 학습할 수 있습니다.

    • 데이터 세트는 훈련 데이터 세트(훈련 데이터 세트 또는 훈련 세트(훈련 세트)라고 함)라고 하는 훈련을 위해 수집된 일부 샘플로 구성됩니다.
    • 그러나 훈련 데이터에서 잘 수행되는 모델이 반드시 "새 데이터 세트"에서 동일한 성능을 갖는 것은 아닙니다. 여기서 "새 데이터 세트"는 일반적으로 테스트 데이터 세트(테스트 데이터 세트 또는 테스트 세트(테스트 세트)라고 합니다. ))
  • 사용 가능한 데이터 세트는 일반적으로 두 부분으로 나눌 수 있습니다. 학습 데이터 세트는 모델 매개변수를 피팅하는 데 사용되고 테스트 데이터 세트는 피팅된 모델을 평가하는 데 사용됩니다.

    • "훈련 데이터 세트에 대한 모델의 성능"은 "학생의 모의고사 점수"로 생각할 수 있으며, 이 점수는 일부 실제 최종 시험의 참고 자료로 사용되며, 성적이 좋아도 최종 시험이 보장되지는 않습니다. 성공
    • 모델이 훈련 세트에서는 잘 수행되지만 테스트 세트로 일반화하지 못하는 경우 해당 모델은 과적합이라고 합니다 . 실생활에서와 마찬가지로 모의고사를 잘 쳐도 실제 시험이 항상 좋은 성적을 내는 것은 아닙니다.

1.2.4 최적화 알고리즘(최적화 알고리즘)

  • 일부 데이터 소스와 해당 표현, 모델 및 적절한 손실 함수가 있으면 손실 함수를 최소화하기 위해 최상의 매개변수를 검색할 수 있는 알고리즘이 필요합니다 . 딥러닝에서 가장 널리 사용되는 최적화 알고리즘은 일반적으로 경사하강법(gradientdescent)이라는 기본 방법을 기반으로 합니다.
    • 각 단계에서 경사하강법은 각 매개변수를 검사하여 해당 매개변수에 작은 변화만 있는 경우 훈련 세트 손실이 어느 방향으로 이동하는지 확인합니다.
    • 그런 다음 손실을 줄일 수 있는 방향으로 매개변수를 최적화합니다.

1.3 다양한 머신러닝 문제

1.3.1 지도 학습

  • 지도 학습은 "주어진 입력 특성" 레이블을 예측하는 데 적합합니다 . 각 "기능-라벨" 쌍을 예시라고 합니다. 때로는 레이블을 알 수 없는 경우에도 샘플이 입력 기능을 참조할 수 있습니다. 목표는 모든 입력 특성을 레이블에 매핑할 수 있는 모델을 생성하는 것입니다(예: 예측).

    • 예: 환자가 심장마비를 일으킬지 여부를 예측해야 한다고 가정하면 "심장마비" 또는 "심장마비가 일어나지 않음"이라는 관찰 결과가 샘플의 라벨이 됩니다. 입력 특징은 심박수, 확장기 및 수축기 혈압 등과 같은 활력 징후일 수 있습니다.
  • 지도 학습은 매개 변수를 훈련할 때 모델에 각 예에 실제 레이블이 있는 데이터 세트가 제공되기 때문에 작동합니다. 업계에서 가장 성공적인 머신러닝 애플리케이션은 지도 학습을 사용합니다. 이는 많은 중요한 작업이 특정 사용 가능한 데이터 세트를 바탕으로 알려지지 않은 무언가의 확률을 추정하는 것으로 설명될 수 있기 때문입니다 . 예를 들어:

    • 영어 문장이 주어지면 올바른 프랑스어 번역을 예측하세요.
    • 이번 달 재무 보고서 데이터를 기반으로 다음 달 주식 가격을 예측합니다.
  • 지도 학습의 학습 과정은 일반적으로 세 단계로 나눌 수 있습니다.

    • 1. 알려진 다수의 데이터 샘플에서 하위 집합을 무작위로 선택하고 각 샘플에 대한 실제 레이블을 얻습니다. 때때로 이러한 샘플에는 이미 라벨이 지정되어 있으며(예: 환자가 내년 내에 회복할 것인가?) 때로는 이러한 샘플에 수동으로 라벨을 지정해야 할 수도 있습니다(예: 이미지 분류). 이러한 입력과 해당 라벨이 함께 학습 데이터세트를 형성합니다.
    • 2. 교육 데이터 세트를 입력으로 사용하고 "학습된 모델"을 출력하는 지도 학습 알고리즘을 선택합니다.
    • 3. 이전에 볼 수 없었던 샘플 특징을 이 "학습이 완료된 모델"에 넣고 모델의 출력을 해당 라벨의 예측으로 사용합니다.

여기에 이미지 설명을 삽입하세요

1.3.1.1 회귀
  • 회귀(regression)는 가장 간단한 지도 학습 작업 중 하나입니다. 인생의 많은 문제는 회귀 문제로 분류될 수 있습니다. 회귀 문제를 판단하는 좋은 경험 법칙은 "얼마나"에 대한 질문은 회귀 문제일 가능성이 높다는 것 입니다 . 예를 들어:
    • 이 작업은 몇 시간 정도 걸리나요?
    • 앞으로 6시간 동안 이 마을에는 얼마나 많은 비가 내릴 것으로 예상됩니까?
1.3.1.2 분류
  • 이미지에 표시된 텍스트를 자동으로 이해하고 손으로 쓴 문자를 알려진 문자에 매핑하는 애플리케이션을 설계합니다. 이 "어떤" 문제를 분류 문제라고 합니다 . 분류 문제는 모델이 표본이 어떤 범주(범주, 클래스(클래스))에 속하는지 예측할 수 있기를 바랍니다.

    • 가장 간단한 분류 문제는 범주가 2개뿐인 것을 이항 분류라고 하며, 범주가 2개 이상인 경우 이 문제를 다중 클래스 분류라고 합니다.
    • 회귀는 회귀 함수를 훈련하여 값을 출력하는 것이고, 분류는 분류기를 훈련하여 예측된 범주를 출력하는 것입니다. 회귀 문제 해결 과 달리 분류 문제의 일반적인 손실 함수를 교차 엔트로피라고 합니다.
  • 확률의 언어로 모델 이해: 샘플 특성이 주어지면 모델은 가능한 각 클래스에 확률을 할당합니다. 예를 들어, 고양이와 개 분류의 예에서 분류기는 이미지가 고양이일 확률 0.9를 출력할 수 있습니다. 분류기는 이미지가 고양이를 묘사한다고 90% 확신합니다. 예측된 클래스 확률의 크기는 모델의 불확실성을 전달합니다.

  • 분류는 이항, 다항보다 훨씬 더 복잡해질 수 있습니다. 예를 들어, 여러 클래스 간의 관계를 가정하는 계층 구조를 찾는 데 사용할 수 있는 분류 작업의 변형이 있습니다 . 따라서 모든 오류가 동일하게 생성되는 것은 아닙니다. 사람들은 먼 범주로 분류되기보다는 관련 범주로 잘못 분류되는 것을 선호하는데, 이를 종종 계층적 분류(hierarchical classification)라고 합니다.

1.3.1.3 문제 신고
  • 상호 배타적이지 않은 클래스를 예측하는 학습 문제를 다중 레이블 분류라고 합니다 . 예를 들어 사람들이 기술 블로그에 게시하는 태그인 "기계 학습" "기술" "가젯" "프로그래밍 언어" "Linux" "클라우드 컴퓨팅" "AWS"를 생각해 보세요. 개념이 서로 연관되어 있기 때문에 일반적인 기사에서는 5-10개의 태그를 사용할 수 있습니다 . "클라우드 컴퓨팅"에 대한 게시물에서는 "AWS"를 언급할 수 있고, "기계 학습"에 대한 게시물에서는 "프로그래밍 언어"를 언급할 수 있습니다.

1.3.2 비지도 학습

  • 위의 모든 예는 지도 학습과 관련이 있습니다. 즉, 모델에는 거대한 데이터 세트가 제공되어야 합니다. 각 샘플에는 특징과 해당 라벨 값이 포함되어 있습니다 . 직업에 아주 구체적인 목표가 없다면 "자발적으로" 학습해야 합니다. 예를 들어, 상사가 우리에게 많은 양의 데이터를 제공한 다음 이를 데이터 과학 연구에 사용하도록 요청할 수 있지만 결과에 대한 요구 사항은 없습니다. 이러한 유형의 데이터에 "대상"이 없는 기계 학습 문제를 종종 비지도 학습이라고 합니다.
    • 클러스터링
      • 레이블 없이 데이터를 분류하는 것이 가능합니까? 예를 들어 일련의 사진이 주어지면 풍경, 개, 아기, 고양이, 산 사진으로 나눌 수 있습니까? 마찬가지로 사용자의 웹 검색 기록 세트가 주어지면 사용자는 유사한 행동이 클러스터링됩니까?
    • 주성분분석(Principal Component Analysis) :
      • 데이터의 선형 종속 속성을 정확하게 포착하기 위해 소수의 매개변수를 찾을 수 있습니까? 예를 들어, 공의 궤적은 공의 속도, 직경, 질량으로 설명할 수 있습니다. 또 다른 예로, 재단사는 옷에 맞게 인체의 모양을 상당히 정확하게 설명하는 작은 매개변수 세트를 개발했습니다.
    • 인과관계 및 확률적 그래픽 모델
      • 당신이 관찰하는 많은 데이터의 근본 원인을 설명할 수 있습니까? 예를 들어 주택 가격, 오염, 범죄, 지리, 교육, 임금에 대한 인구 통계 데이터가 있는 경우 단순히 경험적 데이터를 기반으로 이들 간의 관계를 발견할 수 있습니까?

1.3.3 강화학습

  • 지도 학습이든 비지도 학습이든 사전에 많은 양의 데이터를 얻은 다음 환경과 상호 작용하지 않고 모델이 시작됩니다. 여기서의 모든 학습은 알고리즘이 환경과 분리된 후에 이루어지며, 이를 오프라인 학습이라고 합니다.

  • 강화 학습에는 입력 데이터 세트가 필요하지 않으며 환경과 상호 작용하고 조치를 취할 수 있습니다. 여기에는 로봇, 대화 시스템, 심지어 비디오 게임 개발에 적용되는 인공 지능이 포함될 수 있습니다. 심층 강화 학습(Deep Reinforcement Learning)은 강화 학습 문제에 딥 러닝을 적용한 것입니다.

  • 강화 학습 문제에서 에이전트는 일련의 시간 단계에 걸쳐 환경과 상호 작용합니다. 각 특정 시점에 에이전트는 환경으로부터 일부 관찰을 받고 작업을 선택해야 하며, 그런 다음 일부 메커니즘(액추에이터라고도 함)을 통해 환경으로 다시 전송되고 마지막으로 에이전트가 보상을 받습니다. 그 후 새로운 주기가 시작되고 에이전트는 후속 관찰을 수신하고 후속 조치를 선택하는 등의 작업을 수행합니다.

강화학습의 목표는 좋은 정책을 생성하는 것입니다. 강화 학습 에이전트가 선택한 "행동"은 환경 관찰에서 행동으로 매핑되는 기능인 정책에 의해 관리됩니다.

여기에 이미지 설명을 삽입하세요

1.4 딥러닝의 기원

  • 다양한 머신러닝 문제를 해결하기 위해 딥러닝은 강력한 도구를 제공합니다 . 많은 딥러닝 방법이 최근에 와서야 획기적인 발전을 이루었지만, 데이터를 사용하고 신경망을 프로그래밍하는 핵심 아이디어는 수세기 동안 연구되어 왔습니다.

  • 신경망이라는 이름은 생물학적 영감에서 유래되었습니다. 연구자들은 상호 작용하는 뉴런의 네트워크와 유사한 계산 회로를 조립하려고 노력해 왔으며, 그 핵심에는 오늘날 대부분의 네트워크에서 찾을 수 있는 몇 가지 주요 원칙이 있습니다.

    • 종종 레이어 라고 불리는 선형 및 비선형 처리 장치의 교대
    • 체인 규칙 (역전파라고도 함)을 사용하여 네트워크의 모든 매개변수를 한 번에 조정

1.5 딥러닝의 발전

  • 드롭아웃(Srivastava et al, 2014)과 같은 새로운 용량 제어 방법은 과적합 위험을 완화하는 데 도움이 됩니다.
  • 주의 메커니즘 : 학습 가능한 매개변수를 늘리지 않고 시스템 메모리와 복잡성을 늘리는 방법
  • 다단계 설계 : 예: 메모리 네트워크(Sukhbaatar et al, 2015) 및 신경 프로그래머-통역사(Reed and De Freitas. 2015)
  • 생성적 적대 네트워크 : (Godfellow et al, 2014). 생성적 적대 네트워크의 주요 혁신은 샘플러를 미분 가능한 매개변수를 갖춘 임의의 알고리즘으로 대체하는 것 입니다 . 그런 다음 판별기(실제로는 2샘플 테스트)가 가짜 데이터와 실제 데이터를 구별할 수 없도록 이 데이터를 조정합니다.
  • 병렬 및 분산 훈련 알고리즘 구축 : 많은 경우 단일 GPU로는 훈련에 사용할 수 있는 대량의 데이터를 처리하기에 충분하지 않습니다.
  • 딥 러닝 프레임워크 : 아이디어 확산에 중요한 역할을 함
    • 1세대 프레임워크: Caffe, Torch 및 Theano
    • 2세대 프레임워크: TensorFlow, CNTK, Caffe2 및 Apache MXNet
    • 3세대 프레임워크: PyTorch, MXNet의 Gluon API 및 Jax

1.6 딥러닝의 특징

  • 머신 러닝은 인공 지능의 한 분야/방법인 반면, 딥 러닝은 머신 러닝의 하위 집합입니다.

  • 기계 학습은 데이터를 사용하여 음성 인식에서 오디오를 텍스트로 변환하는 등 입력과 출력 간의 전환을 학습할 수 있습니다. 그렇게 함으로써, 이 표현을 출력으로 변환하기 위해 알고리즘에 적합한 방식으로 데이터를 표현해야 하는 경우가 많습니다.

    • 딥 러닝은 "심층"이며, 모델은 변환의 많은 "계층"을 학습하며, 각 계층은 표현 수준을 제공합니다.
    • 예를 들어 입력에 가까운 레이어는 데이터의 하위 수준 세부정보를 나타낼 수 있는 반면, 분류 출력에 가까운 레이어는 차별화를 위한 보다 추상적인 개념을 나타낼 수 있습니다.
    • 표현 학습 의 목적은 표현 자체를 찾는 것이기 때문에 딥러닝은 "다단계 표현 학습"이라고 할 수 있습니다.
  • 딥 러닝 접근 방식 중 가장 눈에 띄는 공통점은 엔드투엔드 교육을 사용한다는 것입니다 . 즉, 개별적으로 조정된 구성 요소를 기반으로 시스템을 조립하는 대신 시스템을 구축한 다음 공동으로 성능을 조정합니다. 따라서 딥 러닝의 주요 이점은 기존 학습 파이프라인의 끝 부분에 있는 얕은 모델뿐만 아니라 노동 집약적인 특성 엔지니어링 프로세스도 대체한다는 것입니다.

2. 예비 지식

2.1 데이터 조작

  • 텐서라고도 하는 N차원 배열은 어떤 딥 러닝 프레임워크를 사용하든 해당 텐서 클래스 (MXNet의 ndarray, Pytorch 및 TensorFlow의 Tensor)는 Numpy의 ndarray와 유사합니다.
    • 딥 러닝 프레임워크에는 NumPy의 ndarray보다 더 많은 기능이 있습니다. 첫째, GPU는 가속 컴퓨팅을 잘 지원하는 반면 NumPy는 CPU 컴퓨팅만 지원하고, 둘째, 텐서 클래스는 자동 차별화를 지원합니다 . 이러한 함수는 텐서 클래스를 딥러닝에 더욱 적합하게 만듭니다. (특별한 설명이 없으면 이 글에서 언급하는 텐서는 텐서 클래스의 인스턴스를 의미합니다.)

2.1.1 시작하기

  • 텐서는 여러 차원을 가질 수 있는 값의 배열을 나타냅니다. 하나의 축을 가진 텐서는 수학적 벡터(벡터)에 해당하고, 두 개의 축을 가진 텐서는 수학적 행렬(atrix)에 해당하며, 세 개 이상의 축을 가진 텐서는 특별한 수학적 이름을 갖지 않습니다.
    import torch
    
    x = torch.arange(12) # 使用 arange 创建一个行向量,包含以 0 开始的前 12 个整数
    print(x)
    print(x.shape) # 通过张量的 shape 属性来访问张量 (沿每个轴的长度) 的形状
    
    # 如果只想知道张量中元素的总数,即形状的所有元素乘积,可以检查它的大小 (size)
    # 因为这里在处理的是一个向量,所以 shape 与 size 相同
    print(x.numel())
    
    # 要想改变一个张量的形状而不改变元素数量和元素值,可以调用 reshape 函数
    # 虽然张量的形状发生了改变,但其元素值并没有变。通过改变张量的形状张量的大小不会改变
    X = x.reshape(3, 4) # 把张量 x 从形状为 (12,) 行向量转换为形状为 (3, 4) 矩阵
    # 可以通过 -1 来⾃动计算出维度的功能
    # 用 x.reshape(-1,4) 或 x.reshape(3,-1) 来取代 x.reshape(3,4)
    print(X)
    
    # 创建全 0 或全 1 常量
    y = torch.zeros((2, 3, 4))
    y = torch.ones((2, 3, 4))
    print(y)
    
    # 每个元素都从均值为 0、标准差为 1 的标准高斯分布 (正态分布) 中随机采样
    z = torch.randn(3, 4)
    print(z)
    
    # 提供包含数值的 Python 列表 (或嵌套列表),为所需张量中的每个元素赋予确定值
    # 最外层的列表对应于轴 0,内层的列表对应于轴 1
    w = torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
    print(w)
    

2.1.2 연산자

  • 일반적인 표준 산술 연산자(+, -, *, / 및 )는 동일한 모양 의 임의 텐서에 대한 요소별 연산 으로 업그레이드 가능 **
  • 여러 텐서를 함께 연결하고 끝에서 끝까지 쌓아서 더 큰 텐서를 형성합니다. 텐서 목록을 제공하고 연결할 축을 제공하기만 하면 됩니다.
    import torch
    
    x = torch.tensor([1.0, 2, 4, 8])
    y = torch.tensor([2, 2, 2, 2, ])
    print(x + y, x - y, x * y, x / y, x ** y) # ** 运算符是求幂运算
    print(torch.exp(x))
    
    x = torch.arange(12, dtype=torch.float32).reshape(3, 4) # 创建一个形状为 (3,4) 的张量 x,其中包含了从 0 到 11 的连续数字,其数据类型为 torch.float32
    y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
    print(torch.cat((x, y), dim=0)) # 将张量x和y在维度0上进行拼接,即将y拼接在x的下方,拼接后的张量形状为(6,4)
    print(torch.cat((x, y), dim=1)) # 将张量x和y在维度1上进行拼接,即将y拼接在x的右侧,拼接后的张量形状为(3,8)
    # 通过逻辑运算符构建二元张量
    # 如果 x 和 y 在该位置相等,则新张量中相应项的值为 1,否则该位置为 0
    print(x == y)
    # 对张量中的所有元素进⾏求和,会产⽣⼀个单元素张量
    print(x.sum())
    

2.1.3 방송 메커니즘

  • 모양이 다르더라도 다음과 같이 작동하는 브로드캐스팅 메커니즘을 호출하여 요소별 작업을 수행할 수 있습니다.
    • 변환 후 두 텐서가 동일한 모양을 갖도록 요소를 적절하게 복제하여 하나 또는 두 배열을 확장합니다.
    • 결과 배열에 대해 요소별 작업을 수행합니다.
import torch

a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
print(a)
print(b)

# 将两个矩阵⼴播为⼀个更⼤的 3×2 矩阵:矩阵 a 复制列,矩阵 b 复制⾏,然后再按元素相加
print(a + b)

2.1.4 인덱싱과 슬라이싱

  • Python 배열과 마찬가지로 텐서의 요소는 인덱스로 액세스할 수 있습니다. 첫 번째 요소의 인덱스는 0이고 마지막 요소의 인덱스는 -1입니다. 첫 번째 요소와 마지막 요소 이전의 요소를 포함하도록 범위를 지정할 수 있습니다.
    import torch
    
    x = torch.arange(12, dtype=torch.float32).reshape(3, 4)
    
    
    print(x[-1]) # 用 [-1] 选择最后一个元素
    print(x[1:3]) # 用 [1:3] 选择第二个和第三个元素
    
    # 指定索引来将元素写入矩阵
    x[1, 2] = 9
    print(x)
    
    # 为多个元素赋值相同的值:只需索引所有元素,然后为它们赋值
    x[0:2, :] = 12 # : 表示沿轴 1(列)的所有元素
    print(x)
    

2.1.5 메모리 저장

  • 일부 작업을 실행하면 새로운 결과를 위해 메모리가 할당될 수 있습니다. 예를 들어, y = x + y를 사용하면 y가 가리키는 텐서는 역참조되고 대신 새로 할당된 메모리의 텐서를 가리킵니다.
    import torch
    
    x = torch.arange(12, dtype=torch.float32).reshape(3, 4)
    y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
    
    # 使用切片表示法将操作的结果分配给先前分配的数组,例如 Y[:]= <expression>
    z = torch.zeros_like(y) # 使用 zeros_like 来分配一个全 0 的块
    print('id(z):', id(z))
    z[:] = x + y
    print('id(z):', id(z))
    

2.1.6 다른 Python 객체로 변환

  • 딥 러닝 프레임워크에서 정의된 텐서를 NumPy 텐서(ndarray)로 변환하거나 그 반대로 변환하는 것은 쉽습니다. 토치 텐서와 numpy 배열은 기본 메모리를 공유하며, 한 텐서를 변경하는 내부 작업은 다른 텐서도 변경합니다.

    import torch
    
    x = torch.arange(12, dtype=torch.float32).reshape(3, 4)
    A = x.numpy()
    B = torch.tensor(A)
    
    print(type(A), type(B))
    
  • 크기 1의 텐서를 Python 스칼라로 변환하려면 항목 함수 또는 Python의 내장 함수를 호출하세요.

    import torch
    
    a = torch.tensor([3.5])
    
    print((a, a.item(), float(a), int(a)))
    

2.2 데이터 전처리

  • Python에서 흔히 사용하는 데이터 분석 도구 중에는 텐서와 호환되는 pandas 패키지가 주로 사용됩니다.

2.2.1 데이터 세트 읽기

  • 먼저 인공 데이터 세트를 생성하고 이를 CSV(쉼표로 구분된 값) 파일 .../data/house_tiny.csv에 저장합니다. 다른 형식으로 저장된 데이터도 비슷한 방식으로 처리할 수 있습니다. 다음은 데이터세트를 행별로 CSV 파일에 씁니다.
  • 생성된 CSV 파일에서 원시 데이터세트를 로드하려면 pandas 패키지를 가져오고 read_csv 함수를 호출하세요. 데이터 세트에는 4개의 행과 3개의 열이 있습니다. 여기서 각 행은 방 수("NumRooms"), 골목 유형("Alley") 및 주택 가격("Price")을 설명합니다.
    import os
    import pandas as pd
    
    os.makedirs(os.path.join('..', 'data'), exist_ok=True)
    data_file = os.path.join('..', 'data', 'house_tiny.csv')
    with open(data_file, 'w') as f:
        f.write('NumRooms,Alley,Price\n')
        f.write('NA,Pave,127500\n')
        f.write('2,NA,106000\n')
        f.write('4,NA,178100\n')
        f.write('NA,NA,140000\n')
    
    data = pd.read_csv(data_file)
    print(data)
    
    # 输出
       NumRooms Alley   Price
    0       NaN  Pave  127500
    1       2.0   NaN  106000
    2       4.0   NaN  178100
    3       NaN   NaN  140000
    

2.2.2 결측값 처리

  • "NaN" 항목은 누락된 값을 나타냅니다. 누락된 데이터를 처리하기 위한 대표적인 방법으로는 보간(interpolation)과 삭제(deletion) 가 있는데, 보간(interpolation)은 대체값을 사용하여 누락된 값을 보충하고, 삭제(delete)는 누락된 값을 직접 무시하는데 여기서는 보간(interpolation)을 고려한다.
    • 데이터를 위치 인덱스 iloc에 따라 입력과 출력으로 나눕니다. 여기서 전자는 데이터의 처음 두 열이고 후자는 데이터의 마지막 열입니다. 입력에서 누락된 값의 경우 "NaN" 항목을 동일한 열의 평균으로 바꿉니다.
    import os
    import pandas as pd
    
    os.makedirs(os.path.join('..', 'data'), exist_ok=True)
    data_file = os.path.join('..', 'data', 'house_tiny.csv')
    with open(data_file, 'w') as f:
        f.write('NumRooms,Alley,Price\n')
        f.write('NA,Pave,127500\n')
        f.write('2,NA,106000\n')
        f.write('4,NA,178100\n')
        f.write('NA,NA,140000\n')
    
    data = pd.read_csv(data_file)
    # 通过位置索引 iloc,将 data 分成 inputs 和 outputs
    # inputs 为 data 的前两列,outputs 为 data 的最后一列
    inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
    inputs = inputs.fillna(inputs.mean())
    
    print(inputs)
    
    # 输出
       NumRooms Alley
    0       3.0  Pave
    1       2.0   NaN
    2       4.0   NaN
    3       3.0   NaN
    

2.2.3 텐서 형식으로 변환

  • 위 입력 및 출력의 모든 항목은 숫자 유형이며 텐서 형식으로 변환될 수 있습니다. 데이터가 텐서 형식인 경우 텐서 함수를 통해 추가로 조작할 수 있습니다.
    import torch
    
    x, y = torch.tensor(inputs.values), torch.tensor(outputs.values)
    print(x, y)
    

2.3 선형대수학

2.3.1 스칼라

  • 하나의 값만 포함하는 것을 스칼라(scalar)라고 하는데, 본 논문에서는 스칼라 변수는 일반 소문자 로 표현하고 , 스칼라는 요소가 하나만 있는 텐서로 표현한다.
    import torch
    
    x = torch.tensor(3.0)
    y = torch.tensor(2.0)
    
    print(x + y, x * y, x / y, x**y)
    

2.3.2 벡터

  • 벡터는 벡터의 요소나 구성요소라고 불리는 스칼라 값의 목록으로 볼 수 있습니다. 벡터는 일반적으로 굵은 소문자 기호 로 표시됩니다.
  • 벡터는 1차원 텐서로 표현됩니다 . 일반적으로 텐서는 머신의 메모리 제약에 따라 임의의 길이를 가질 수 있습니다.
    import torch
    
    x = torch.arange(4)
    
    print(x)
    
  • 일반적으로 기본 열 벡터는 벡터 x \mathbf{x} 의 기본 방향입니다.x는 x = [ x 1 x 2 ⋮ xn ] \mathbf{x}=\begin{bmatrix}x_1\\x_2\\\vdots\\x_n\end{bmatrix}로 쓸 수 있습니다 .
    엑스= 엑스1엑스2엑스
길이, 치수 및 모양
  • 벡터는 숫자의 배열일 뿐이며, 모든 배열에 길이가 있는 것처럼 모든 벡터에도 길이가 있습니다. 수학 표기법에서 벡터 x \mathbf{x} 라고 하면x는 n개의 실수 값 스칼라로 구성되며, 이는x ∈ Rn \mathbf{x}\in\mathbb{R}^{n}엑스아르 자형n . 벡터의 길이를 일반적으로 벡터의 차원이라고 합니다.
    import torch
    
    x = torch.arange(4)
    print(len(x)) # 调用 Python 的内置 len() 函数来访问张量的长度
    # 当用张量表示一个向量(只有一个轴) 时,也可通过 .shape 属性访问向量长度
    # 形状(shape)是⼀个元素组,列出了张量沿每个轴的⻓度(维数)
    print(x.shape)
    

    차원 : 벡터나 축의 차원은 벡터나 축의 길이, 즉 벡터나 축의 요소 수를 나타내는 데 사용됩니다. 그러나 텐서의 차원은 텐서가 갖는 축 수를 나타내는 데 사용됩니다. 따라서 이러한 의미에서 텐서 축의 차원은 해당 축의 길이입니다.

2.3.3 매트릭스

  • 벡터는 0차에서 1차까지의 스칼라를 일반화하고, 행렬은 1차에서 2차까지의 벡터를 일반화합니다. 일반적으로 굵은 글씨, 대문자 , 코드에서는 두 개의 축이 있는 텐서로 표시됩니다.
  • 행렬의 행과 열의 개수가 같을 때 그 모양은 정사각형이 되며 이를 정사각행렬이라고 합니다.

A = [ a 11 a 12 ⋯ a 1 na 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ 오전 1시 2 ⋯ amn ] \mathbf{A}=\begin{bmatrix}a_{11}&a_{12}&\ cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\vdots&\vdots&\ddots&\vdots\\a_{m1}&a_{m2}&\cdots&a_{mn}\end{bmatrix }= 1121m 11222m 21n _2n _백만

  • 텐서를 인스턴스화하기 위해 함수를 호출할 때 두 구성요소 m과 n을 지정하여 mxn 모양의 행렬을 생성할 수 있습니다.
  • 행렬의 행과 열이 바뀌는 결과를 행렬의 전치라고 합니다. AT를 사용하여
    A ⊤ = [ a 11 a 21 … am 1 a 12 a 22 … am 2 ⋮ ⋮ ⋱ ⋮ a 1 na에 액세스합니다. 2 n … amn ] \mathbf{A}^\top=\begin{bmatrix}a_{11}&a_{21}&\ldots&a_{m1}\\a_{12}&a_{22}&\ldots&a_{m2}\ \\ vdots&\vdots&\ddots&\vdots\\a_{1n}&a_{2n}&\ldots&a_{mn}\end{bmatrix}= 11121n _21222n _m 1m 2백만
  • 특수 유형의 정사각 행렬인 대칭 행렬 A는 전치와 같습니다. A = A ⊤ \mathbf{A}=\mathbf{A}^{\top}=
    import torch
    
    A = torch.arange(20).reshape(5, 4)
    B = torch.tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]]) # 对称矩阵
    
    print(A)
    print(A.T) # 访问矩阵的转置
    print(B == B.T)
    

2.3.4 텐서

  • 벡터는 스칼라의 일반화이고, 행렬은 벡터의 일반화이며, 더 많은 축을 가진 데이터 구조도 구축할 수 있습니다. 텐서는 임의 개수의 축이 있는 n차원 배열을 설명하는 일반적인 방법입니다 . 예를 들어 벡터는 랭크-1 텐서이고 행렬은 랭크-2 텐서입니다 . 텐서는 특수 글꼴(예: X, Y, Z)의 대문자로 표시됩니다. 인덱싱 메커니즘은 행렬의 인덱싱 메커니즘과 유사합니다.
  • 텐서는 높이, 너비 및 색상 채널(빨간색, 녹색 및 파란색)을 나타내는 채널 축에 해당하는 3개의 축이 있는 n차원 배열로 제공되는 이미지 작업을 시작할 때 더욱 중요해집니다.
    import torch
    
    a = 2
    X = torch.arange(24).reshape(2, 3, 4)
    
    print(X)
    print(a + X)
    print(a * X)
    

2.3.5 텐서 알고리즘의 기본 속성

  • 요소별 단항 연산은 피연산자의 모양을 변경하지 않습니다. 마찬가지로, 동일한 모양을 가진 두 개의 텐서가 있는 경우 요소별 이진 연산의 결과는 동일한 모양의 텐서가 됩니다.
  • 두 행렬의 요소별 곱셈을 Hadamard 곱(수학 기호 ⊙ \odot) 이라고 합니다. )
    A ⊙ B = [ a 11 b 11 a 12 b 12 … a 1 nb 1 na 21 b 21 a 22 b 22 … a 2 nb 2 n ⋮ ⋮ ⋱ ⋮ am 1 bm 1 am 2 bm 2 … amnbmn ] \ mathbf{A}\odot\mathbf{B}=\begin{bmatrix}a_{11}b_{11}&a_{12}b_{12}&\ldots&a_{1n}b_{1n}\\a_{21}b_ {21}&a_{22}b_{22}&\ldots&a_{2n}b_{2n}\\\vdots&\vdots&\ddots&\vdots\\a_{m1}b_{m1}&a_{m2}b_{m2}& \ldots&a_{mn}b_{mn}\end{bmatrix}= 11112121m 1m 112122222m 2m 21n _1n _2n _2n _백만백만
  • 텐서에 스칼라를 곱하거나 추가해도 텐서의 모양은 변경되지 않습니다. 텐서의 각 요소는 스칼라에 의해 추가되거나 곱해집니다.
    import torch
    
    A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
    B = A.clone() # 通过分配新内存,将 A 的一个副本分配给B
    
    # print(A + B)
    print(A * B)
    

2.3.6 차원 축소

  • 이는 모든 형태의 텐서 요소의 합을 나타낼 수 있으며, 행렬 A의 요소 합은 ∑ i = 1 m ∑ j = 1 naij \sum_{i=1}^{m}\sum_{j= 1}^{n }a_{ij}나는 = 1j = 1ij
  • 기본적으로 sum 함수를 호출하면 모든 축을 따라 텐서의 크기가 줄어들어 스칼라가 됩니다 . 합산에 의해 텐서가 축소되는 축을 지정하는 것도 가능합니다
    • 행렬을 예로 들어 모든 의 요소를 합산하여 차원( 축 0 )을 줄이려 면 함수 호출 시 axis=0을 지정할 수 있습니다.
    • axis=1을 지정하면 모든 열 ( 축 1 ) 의 요소를 합산하여 차원이 줄어듭니다.
  • 합계와 관련된 수량은 평균(또는 평균)이며, 이는 합계를 전체 요소 수로 나누어 계산됩니다. 임의 형태의 텐서 평균을 계산하는 호출 가능한 함수
  • 평균을 계산하는 함수는 지정된 축을 따라 텐서의 차원을 줄일 수도 있습니다.
    import torch
    
    A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
    A_sum_axis0 = A.sum(axis=0)
    A_sum_axis1 = A.sum(axis=1)
    
    print(A.sum()) # 矩阵 A 中元素和
    print(A_sum_axis0)
    print(A_sum_axis1)
    print(A.mean())
    print(A.mean(axis=0))
    
비환원 합산
  • 합이나 평균을 계산하기 위해 함수를 호출할 때 축 수를 일정하게 유지하는 것이 유용한 경우가 있습니다.
  • 특정 축(예: 축=0(행 기준))을 따라 A 요소의 누적 합계를 계산하려면 cumsum 함수를 호출하면 됩니다. 이 함수는 축을 따라 입력 텐서의 차원을 줄이지 않습니다.
    import torch
    
    A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
    sum_A = A.sum(axis=1, keepdims=True) # 非降维(列)求矩阵 A 中元素和
    
    print(sum_A)
    print(A.cumsum(axis=0)) 
    

2.3.7 내적

  • 두 개의 벡터 x , y ∈ R d \mathbf{x},\mathbf{y}\in\mathbb{R}^{d}엑스 ,와이아르 자형d , 내적은동일한 위치 x ⊤ y = ∑ i = 1 dxiyi \mathbf{x}^\top\mathbf{y}=\sum_{i=1}^dx_iy_i에서 요소별 곱의 합입니다.엑스 y=나는 = 1엑스와이
    import torch
    
    x = torch.arange(4, dtype=torch.float32)
    y = torch.ones(4, dtype=torch.float32)
    
    print(torch.dot(x, y))
    
  • 내적은 여러 상황에서 유용합니다. 예를 들어, 벡터 세트 x ∈ R d \mathbf{x}\in\mathbb{R}^{d}엑스아르 자형d 로 표현되는 값과 w ∈ R d \mathbf{w}\in\mathbb{R}^{d}의집합아르 자형d는 무게를 나타낸다. x \mathbf{x}x 의 값은 w \mathbf{w}에 따라 가중치가 부여됩니다.w 의 가중합은x ⊤ w \mathbf{x}^{\top}\mathbf{w}엑스
    • 가중치가 음수가 아니고 합이 1인 경우(예: ( ∑ i = 1 dwi = 1 ) \left(\sum_{\boldsymbol{i}=1}^dw_{\boldsymbol{i}}=1\right )( 나는 = 1=1 ) ),내적은 가중 평균을 나타냅니다.
    • 두 벡터를 단위 길이로 정규화한 후 내적은 해당 각도의 코사인을 나타냅니다.

2.3.8 행렬-벡터 곱

  • 행렬 A ∈ R m × n \mathbf{A}\in\mathbb{R}^{m\times n}을 정의합니다.아르 자형m × n 및 벡터x ∈ R n {\mathbf{x}}\in\mathbb{R}^{n}엑스아르 자형n , 행렬-벡터 곱A x \mathbf{Ax}Ax 는 길이가 m인 열 벡터입니다.
  • 행렬-벡터 곱을 사용하여 이전 계층
    A x = [ a 1 ⊤ a 2 ⊤ ⋮ am ⊤ ] x = [ a 1 ⊤ xa 2 ⊤ x ⋮ 오전 ⊤ x ] \mathbf{A}\mathbf{x}=\begin{bmatrix}\mathbf{a}_1^\top\\\mathbf{a}_2^\top\\\vdots\\\ mathbf{a}_m^\top\end{bmatrix}\mathbf{x}=\begin{bmatrix}\mathbf{a}_1^\top\mathbf{x}\\\mathbf{a}_2^\top\ mathbf{x}\\\vdots\\\mathbf{a}_m^\top\mathbf{x}\end{bmatrix}도끼= 12 엑스= 1엑스2엑스엑스
    import torch
    
    A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
    x = torch.arange(4, dtype=torch.float32)
    
    print(torch.mv(A, x)) # 使⽤ mv 函数执行矩阵-向量积
    

2.3.9 행렬-행렬 곱셈

  • 假设两个 A ∈ R n × k \mathbf{A}\in\mathbb{R}^{n\times k} ARn×k B ∈ R k × m \mathbf{B}\in\mathbb{R}^{k\times m} BRk×m
    A = [ a 11 a 12 ⋯ a 1 k a 21 a 22 ⋯ a 2 k ⋮ ⋮ ⋱ ⋮ a n 1 a n 2 ⋯ a n k ] , B = [ b 11 b 12 ⋯ b 1 m b 21 b 22 ⋯ b 2 m ⋮ ⋮ ⋱ ⋮ b k 1 b k 2 ⋯ b k m ] \mathbf{A}=\begin{bmatrix}a_{11}&a_{12}&\cdots&a_{1k}\\a_{21}&a_{22}&\cdots&a_{2k}\\\vdots&\vdots&\ddots&\vdots\\a_{n1}&a_{n2}&\cdots&a_{nk}\end{bmatrix},\quad\mathbf{B}=\begin{bmatrix}b_{11}&b_{12}&\cdots&b_{1m}\\b_{21}&b_{22}&\cdots&b_{2m}\\\vdots&\vdots&\ddots&\vdots\\b_{k1}&b_{k2}&\cdots&b_{km}\end{bmatrix} A= a11a21an 11222n 21K _2NK ,= 1121케이 11222k2 _1m _2m _km

C = A B = [ a 1 ⊤ a 2 ⊤ ⋮ a n ⊤ ] [ b 1 b 2 ⋯ b m ] = [ a 1 ⊤ b 1 a 1 ⊤ b 2 ⋯ a 1 ⊤ b m a 2 ⊤ b 1 a 2 ⊤ b 2 ⋯ a 2 ⊤ b m ⋮ ⋮ ⋱ ⋮ a n ⊤ b 1 a n ⊤ b 2 ⋯ a n ⊤ b m ] \mathbf{C}=\mathbf{A}\mathbf{B}=\begin{bmatrix}\mathbf{a}_1^\top\\\mathbf{a}_2^\top\\\vdots\\\mathbf{a}_n^\top\end{bmatrix}\begin{bmatrix}\mathbf{b}_1&\mathbf{b}_2&\cdots&\mathbf{b}_m\end{bmatrix}=\begin{bmatrix}\mathbf{a}_1^\top\mathbf{b}_1&\mathbf{a}_1^\top\mathbf{b}_2&\cdots&\mathbf{a}_1^\top\mathbf{b}_m\\\mathbf{a}_2^\top\mathbf{b}_1&\mathbf{a}_2^\top\mathbf{b}_2&\cdots&\mathbf{a}_2^\top\mathbf{b}_m\\\vdots&\vdots&\ddots&\vdots\\\mathbf{a}_n^\top\mathbf{b}_1&\mathbf{a}_n^\top\mathbf{b}_2&\cdots&\mathbf{a}_n^\top\mathbf{b}_m\end{bmatrix} C=AB= a1a2an [b1b2]= 1121N11222N212N

  • 행렬-행렬 곱셈 AB \mathbf{AB}AB는 단순히 m개의 행렬-벡터 곱을 수행하는 것으로 간주됩니다.
    import torch
    
    A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
    B = torch.ones(4, 3)
    
    print(torch.mm(A, B)) # 使⽤ mm 函数执行矩阵-矩阵乘法
    

2.3.10 규범

  • 비공식적으로 벡터의 표준은 벡터의 크기입니다. 여기서 고려되는 크기 개념은 치수가 아니라 구성 요소의 크기를 포함합니다.

  • 선형 대수학에서 벡터 노름은 벡터를 스칼라 ff 에 매핑하는 함수입니다. 에프 . 임의의 벡터x \mathbf{x}x , 벡터 노름은 일부 속성을 충족해야 합니다.

    • 첫 번째 속성은 다음과 같습니다. 상수 인자 α \alphaα는 벡터의 모든 요소의 크기를 조정 하고 해당 노름도 동일한 상수 인자 f ( α x ) = ∣ α ∣ f ( x ) f(\alpha\mathbf{x})=|\alpha의 절댓값으로 크기 조정합니다.
      |f( \mathbf{x})f ( α x )=α f ( x )
    • 두 번째 속성은 삼각형 부등식
      f ( x + y ) ≤ f ( x ) + f ( y ) f(\mathbf{x}+\mathbf{y})\leq f(\mathbf{x})+f( \mathbf{y})에프 ( 엑스+y )에프 ( 엑스 )+에프 ( 와이 )
    • 세 번째 속성은 노름이 음수 가 아니어야 (노름은 벡터가 모두 0으로 구성된 경우에만 최소 0입니다)
      f ( x ) ≥ 0 f(\mathbf{x})\geq0에프 ( 엑스 )0
  • 유클리드 거리는 L 2 L_22Norm , n차원 벡터 x \mathbf{x} 가정x 의 요소는x 1 , . . . , xn x_1,...,x_n엑스1,... ,엑스, 그 L 2 L_22노름은 벡터 요소의 제곱합의 제곱근입니다.

    • 패 2 패_22아래 첨자 2는 노름에서 종종 생략됩니다. 즉, Buer x Bu \|\mathbf{x}\|x 等同于 ∥ x ∥ 2 \|\mathbf{x}\|_2 x2
      ∥ x ∥ 2 = ∑ i = 1 n x i 2 \|\mathbf{x}\|_2=\sqrt{\sum_{i=1}^nx_i^2} x2=i=1nxi2
  • 深度学习中更经常地使用 L 2 L_2 L2 范数的平方,也会经常遇到 L 1 L_1 L1 范数,它表示为向量元素的绝对值之和
    ∥ x ∥ 1 = ∑ i = 1 n ∣ x i ∣ \|\mathbf{x}\|_1=\sum_{i=1}^n|x_i| x1=i=1nxi

  • L 2 L_2 L2 范数和 L 1 L_1 L1 范数都是更一般的 L p L_p Lp 范数的特例
    ∥ x ∥ p = ( ∑ i = 1 n ∣ x i ∣ p ) 1 / p \|\mathbf{x}\|_p=\left(\sum_{i=1}^n|x_i|^p\right)^{1/p} xp=(i=1nxip)1/p

  • 벡터의 L 2 L_2 와 유사2노름, 행렬 X ∈ R m × n \mathbf{X}\in\mathbb{R}^{m\times n}엑스아르 자형m × n 의 프로베니우스 노름은

    • Frobenius 노름은 벡터 노름의 모든 속성을 만족합니다. 이는 행렬 벡터의 L 2 L_2 와 같습니다.2范数
      rr X MAT F = ∑ i = 1 m ∑ j = 1 nxij 2 \|\mathbf{X}\|_F=\sqrt{\sum_{i=1}^m\sum_{j=1}^nx_ {ij}^2}X 에프=나는 = 1j = 1엑스ij2
    import torch
    
    u = torch.tensor([3.0, 4.0])
    
    print(torch.norm(u))     # 计算 L2 范数
    print(torch.abs(u).sum)  # 计算 L1 范数
    print(torch.norm(torch.ones((4, 9)))) # 计算矩阵范数
    

    딥러닝에서는 관찰된 데이터에 할당된 확률을 최대화하고 예측과 실제 관찰 사이의 거리를 최소화하는 등 최적화 문제를 해결하려고 시도하는 경우가 많습니다. 항목(예: 단어, 제품, 뉴스 기사)은 유사한 항목 간의 거리가 최소화되고 다른 항목 간의 거리가 최대가 되도록 벡터로 표현됩니다. 일반적으로 표준으로 표현되는 목표

2.4 미적분학

  • 근사법은 적분법의 기원입니다 . 미적분학의 또 다른 분야인 미분학에서 미분학의 가장 중요한 응용은 최적화 문제 입니다.

여기에 이미지 설명을 삽입하세요

  • 딥 러닝에서 모델은 점점 더 많은 데이터를 볼 때마다 점점 더 좋아지도록 지속적으로 업데이트하여 "훈련"됩니다. 종종 나아진다는 것은 손실 함수를 최소화하는 것을 의미합니다 . 최종 결과는 이전에 본 적이 없는 데이터에서도 잘 작동하는 모델입니다. 그러나 모델을 "훈련"하는 것은 실제로 볼 수 있는 데이터에만 모델을 맞출 수 있습니다 . 따라서 모델을 피팅하는 작업은 두 가지 주요 문제로 분해될 수 있습니다.
    • 최적화: 관찰된 데이터에 모델을 맞추는 과정
    • 일반화: 수학적 원리와 실무자의 지혜를 사용하여 훈련에 사용된 데이터 세트보다 더 효과적인 모델 생성을 안내합니다.

2.4.1 파생상품과 미분상품

  • 딥러닝에서는 모델 매개변수에 대해 미분 가능한 손실 함수를 선택하는 것이 일반적입니다. 간단히 말해서, 각 매개변수에 대해 이 매개변수를 극소량씩 늘리거나 줄이면 손실이 얼마나 빨리 증가하거나 감소하는지 알 수 있습니다.

  • 함수 f : R → R f:\mathbb{R}\to\mathbb{R}가 있다고 가정합니다.에프:아르 자형입력과 출력이 스칼라인 R . ff라면f 의 도함수가
    존재하며, 이 극한은 f ′ ( x ) = lim ⁡ h → 0 f ( x + h ) − f ( x ) h f'(x)=\lim_{h\to0}\frac로 정의됩니다. {f(x+h)-f(x)}h에프 (엑스)=h 0시간에프 ( 엑스+)-f ( x )

  • 만약 f ′ ( a ) f^{\prime}(a)에프 (a)가 존재하면fff 에서aaa 는 미분가능하다. ff라면f 가 구간의 모든 숫자에 대해 미분 가능하면 이 함수는 이 구간에서 미분 가능합니다. 위 공식에서 도함수f ′ ( a ) f^{\prime}(a)는에프 (a)f ( a ) f(a)로 해석됩니다.xx에 상대적인 f ( a )x 의 순간 변화율입니다 . 소위 순간 변화율은xx를xhh 단위로 변경h , 그리고hhh는 0에 가깝습니다.

  • 도함수
    f ′ ( x ) = y ′ = dydx = dfdx = ddxf ( x ) = D f ( x ) = D xf ( x ) f'(x)=y'=\frac{dy} {dx의 여러 등가 기호 }=\frac{df}{dx}=\frac{d}{dx}f(x)=Df(x)=D_xf(x)에프 (엑스)=와이=dx _d y=dx _df=dx _에프 ( 엑스 )=에프 ( 엑스 )=엑스에프 ( 엑스 )

  • 여기서 ddx \frac{d}{dx}dx _그리고 DDD미분 연산자로미분 연산을 의미하며일반적인 미분 규칙은다음과 같습니다:
    ddx [ C f ( x ) ] = C ddxf ( x ) \frac d{dx}[Cf(x)]=C\frac d{ dx}f(x)dx _[ Cf ( x ) ]=dx _에프 ( 엑스 )

ddx [ f ( x ) + g ( x ) ] = ddxf ( x ) + ddxg ( x ) \frac d{dx}[f(x)+g(x)]=\frac d{dx}f(x) +\frac d{dx}g(x)dx _[ f ( x )+g ( x )]=dx _에프 ( 엑스 )+dx _( 엑스 )

ddx [ f ( x ) g ( x ) ] = f ( x ) ddx [ g ( x ) ] + g ( x ) ddx [ f ( x ) ] \frac{d}{dx}[f(x)g( x)]=f(x)\frac{d}{dx}[g(x)]+g(x)\frac{d}{dx}[f(x)]dx _[ f ( x ) g ( x )]=에프 ( 엑스 )dx _[ g ( x )]+( 엑스 )dx _[ 에프 ( 엑스 )]

ddx [ f ( x ) g ( x ) ] = g ( x ) ddx [ f ( x ) ] − f ( x ) ddx [ g ( x ) ] [ g ( x ) ] 2 \frac{d}{dx} \left[\frac{f(x)}{g(x)}\right]=\frac{g(x)\frac{d}{dx}[f(x)]-f(x)\frac{ d}{dx}[g(x)]}{[g(x)]^2}dx _[( 엑스 )f ( x )]=[ g ( x ) ]2( 엑스 )dx _[ 에프 ( 엑스 )]-에프 ( 엑스 )dx _[ g ( x ) ]

  • 아래 f ( x ) = 3 x 2 − 4 xf(x)=3x^2-4x에프 ( 엑스 )=3x _2-도함수를 더 잘 설명하기 위한 예로서 4 x
import numpy as np
import matplotlib.pyplot as plt

def f(x):
    return 3 * x ** 2 - 4 * x

def numerical_lim(f, x, h):
    return (f(x + h) - f(x)) / h

# 通过令 x = 1 并让 h 接近 0,则 numerical_lim 结果接近 2
h = 0.1
for i in range(5):
    # 将变量 h 格式化为浮点数,并保留小数点后五位
    print(f'h={
      
      h:.5f}, numerical limit={
      
      numerical_lim(f, 1, h):.5f}')
    h *= 0.1

# 定义 set_figsize 函数来设置图表大小
    # 参数 figsize 是一个长度为 2 的元组,用于指定图形的宽度和高度
    # plt.rcParams 是 Matplotlib 库中的一个全局变量,它是一个字典对象,存储了一些全局默认值
    # figure.figsize 是其中一个键值对,用于设置图形的尺寸,默认值为 (6.0, 4.0)
def set_figsize(figsize=(3.5, 2.5)):
    plt.rcParams['figure.figsize'] = figsize  # 修改全局默认值 figsize

# 用于设置由 matplotlib 生成图表的轴的属性
# axes:图形的轴对象(坐标轴)  legend:图例
def set_axes(axes, xlabel, ylabel, xlim, ylim, xscale, yscale, legend):
    axes.set_xlabel(xlabel)  # x 轴的标签
    axes.set_ylabel(ylabel)  
    axes.set_xscale(xscale)  # x 轴的刻度缩放方式,可以是线性(linear)或对数(log)
    axes.set_yscale(yscale)
    axes.set_xlim(xlim)      # x 轴的范围
    axes.set_ylim(ylim)      
    if legend:               # 如果 legend 参数不为空
        axes.legend(legend)  # 则调用轴对象的 legend() 方法设置图例
    axes.grid()              # 使用 grid() 方法在图形中加入网格

# 定义一个 plot 函数来简洁地绘制多条曲线
# fmts:曲线的样式,可以是一条曲线的样式(字符串)或多条曲线的样式(字符串组成的列表)
    # ('-','m--'):这个字符串元组表示一个紫色 (m) 的虚线 (--) 
    # ('g-.'):这个字符串元组表示一个绿色 (g) 的点划线 (-.) 
    # ('r:'):这个字符串元组表示一个红色 (r) 的点线 (:) 
def plot(X, Y=None, xlabel=None, ylabel=None, legend=None, xlim=None,
        ylim=None, xscale='linear', yscale='linear',
        fmts=('-', 'm--', 'g-.', 'r:'), figsize=(3.5, 2.5), axes=None):

    # 绘制数据点
    if legend is None:
        legend = []       # 设置图例为空列表
    set_figsize(figsize)  # 设置图标大小
    
    # 如果 X 只有⼀个轴,则输出 True
    def has_one_axis(X):
        # 判断 X 对象是否有一个属性 ndim,并且是否等于 1(即 X 是否为一维对象)
        # 判断 X 是否为 list 类型的对象,并且第一个元素是否没有属性 __len__(即判断 X 的第一个元素是否是一维对象)
        return (hasattr(X, "ndim") and X.ndim == 1 or isinstance(X, list)
                and not hasattr(X[0], "__len__"))
    
    if has_one_axis(X):    # 如果 X 只有一个轴
        X = [X]            # 则将 X 放入一个列表中
    if Y is None:
        X, Y = [[]] * len(X), X  # X、Y 的初始值都是包含有 len(X) 个空列表的列表
    elif has_one_axis(Y):  # 如果 Y 只有一个轴
        Y = [Y]
    if len(X) != len(Y):   # 如果 X 和 Y 长度不等,则将 X 复制多份以匹配 Y 的长度
        X = X * len(Y)

    fig, ax = plt.subplots()  # 创建一个新的图形窗口,并返回一个包含 FigFig 对象和 Axes 对象的元组(fig, ax)
    # 遍历 X、Y 和 fmts 三个列表,并使用 zip 函数将它们中的元素一一对应起来
    for x, y, fmt in zip(X, Y, fmts):
        if len(x):              # x 列表不为空
            ax.plot(x, y, fmt)  # 则调用 ax.plot() 函数绘制 x 和 y 之间的数据点,并使用 fmt 参数指定样式
        else:                   # 如果 x 列表为空
            ax.plot(y, fmt)     # 则说明传入的是一个一维的 y 数组
    set_axes(ax, xlabel, ylabel, xlim, ylim, xscale, yscale, legend)
    plt.show()  # 显示图形窗口

# 绘制函数 f(x) 及其在 x = 1 处的切线 y = 2x - 3,其中系数 2 是切线的斜率
x = np.arange(0, 3, 0.1)  # 定义一个从 0 到 3,步长为 0.1 的数组 x
plot(x, [f(x), 2 * x - 3], 'x', 'f(x)', legend=['f(x)', 'Tangent line (x=1)'])
# 输出
h=0.10000, numerical limit=2.30000
h=0.01000, numerical limit=2.03000
h=0.00100, numerical limit=2.00300
h=0.00010, numerical limit=2.00030
h=0.00001, numerical limit=2.00003

여기에 이미지 설명을 삽입하세요

2.4.2 부분 파생상품

  • 딥러닝에서 함수는 종종 많은 변수에 의존합니다. 따라서 미분의 개념을 다변량 함수 로 확장할 필요가 있습니다.

  • y = f ( x 1 , x 2 , … , xn ) y=f(x_{1},x_{2},\ldots,x_{n})와이=에프 ( 엑스1,엑스2,,엑스)_n 변수의 함수. y 섹션iii 매개변수xi x_i엑스的偏导数 (부분 도함수) 为
    ∂ y ∂ xi = lim ⁡ h → 0 f ( x 1 , … , xi − 1 , xi + h , xi + 1 , … , xn ) − f ( x 1 , … , xi , … , xn ) h \begin{aligned}\frac{\partial y}{\partial x_i}=\lim\limits_{h\to0}\frac{f(x_1,\ldots,x_{i-1}, x_i+h,x_{i+1},\ldots,x_n)-f(x_1,\ldots,x_i,\ldots,x_n)}{h}\end{정렬}x∂y _=h 0시간에프 ( 엑스1,,엑스나는 1,엑스+h ,엑스나는 + 1,,엑스)-에프 ( 엑스1,,엑스,,엑스)

  • 편도함수의 여러 등가 기호
    ∂ y ∂ xi = ∂ f ∂ xi = fxi = fi = D if = D xif \begin{aligned}\frac{\partial y}{\partial x_i}=\frac{\partial f} {\부분 x_i}=f_{x_i}=f_i=D_if=D_{x_i}f\end{정렬}x∂y _=x 에프=에프엑스=에프=에프=엑스에프

2.4.3 그라데이션

  • 모든 변수를 포함하는 다변량 함수의 편도함수를 연결하여 함수의 기울기 벡터를 얻을 수 있습니다 . 구체적으로, 함수 f : R n → R f:\mathbb{R}^n\to\mathbb{R}에프:아르 자형NR 에 대한 입력은 nn입니다n 维向量 $\mathbf{x}=[x_1,x_2,\ldots,x_n]^\top $,并且输出是一个标量。函数 f ( x ) f(x) f(x) 相对于 x x x 的梯度是一个包含 n n n 个偏导数的向量
    ∇ x f ( x ) = [ ∂ f ( x ) ∂ x 1 , ∂ f ( x ) ∂ x 2 , … , ∂ f ( x ) ∂ x n ] ⊤ \nabla_{\mathbf{x}}f(\mathbf{x})=\left[\frac{\partial f(\mathbf{x})}{\partial x_1},\frac{\partial f(\mathbf{x})}{\partial x_2},\ldots,\frac{\partial f(\mathbf{x})}{\partial x_n}\right]^\top xf(x)=[x1f(x),x2f(x),,xnf(x)]
  • 假设 x x x 는 nn이다n 차원 벡터의 경우, 다변량 함수 ∇ x A x = A ⊤ \nabla_{\mathbf{x}}\mathbf{A}\mathbf{x}=\mathbf{A}^\top를 미분할 때 다음 규칙이 자주 사용됩니다 .
    엑스도끼=

∇ xx ⊤ A = A \nabla_{\mathbf{x}}\mathbf{x}^{\top}\mathbf{A}=\mathbf{A}엑스엑스 A=

∇ xx ⊤ A x = ( A + A ⊤ ) x \nabla_{\mathbf{x}}\mathbf{x}^\top\mathbf{A}\mathbf{x}=(\mathbf{A}+\mathbf {A}^\top)\mathbf{x}엑스엑스 도끼=( _+ )x

∇ x Bu Bu 2 = ∇ xx ⊤ x = 2 x \nabla_x\|\mathbf{x}\|^2=\nabla_x\mathbf{x}^\top\mathbf{x}=2\mathbf{x}엑스rrx rr _2=엑스엑스 x=2x _

2.4.4 연쇄 법칙

  • 위의 방법은 딥러닝에서 다변량 함수가 일반적으로 복합적이므로 이러한 함수를 구별하기 위해 위의 규칙을 적용하기가 어렵기 때문에 기울기를 찾는 것이 어려울 수 있습니다. 그러나 체인 규칙은 복합 함수를 구별하는 데 사용될 수 있습니다.
    • 일변량 함수를 먼저 고려하십시오. 함수 y = f (u ) y = f(u)를 가정합니다.와이=f ( u )u = g ( x ) u = g(x)=g ( x ) 는 연쇄 규칙
      dydx = dydududx \frac{dy}{dx}=\frac{dy}{du}\frac{du}{dx}에 따라 모두 미분 가능합니다.dx _d y=당신 d ydx __
    • 함수에 임의의 개수의 변수가 있는 경우를 생각해 보세요. 미분 가능한 함수를 가정하면 yyy 유량u 1 , u 2 , … , 음 u_{1},u_{2},\ldots,u_{m}1,2,,, 여기서 각 미분 함수 ui u_i변수 x 1 , x 2 , … , xn x_{1},x_{2},\ldots,x_{n}가 있습니다.엑스1,엑스2,,엑스. 어디야 ?yx 1 , x 2 , … , xn x_{1},x_{2},\ldots,x_{n}엑스1,엑스2,,엑스的函数
      ∂ y ∂ xi = ∂ y ∂ u 1 ∂ u 1 ∂ xi + ∂ y ∂ u 2 ∂ u 2 ∂ xi + ⋯ + ∂ y ∂ um ∂ um ∂ xi \frac{\partial y}{\partial x_i }=\frac{\partial y}{\partial u_1}\frac{\partial u_1}{\partial x_i}+\frac{\partial y}{\partial u_2}\frac{\partial u_2}{\partial x_i }+\cdots+\frac{\partial y}{\partial u_m}\frac{\partial u_m}{\partial x_i}x∂y _=당신1∂y _x당신1+당신2∂y _x당신2++당신∂y _x당신

2.5 자동 미분

  • 딥 러닝 프레임워크는 자동 미분 이라고 알려진 도함수를 자동으로 계산하여 도함수의 속도를 높입니다 . 실제로 설계된 모델에 따라 시스템은 어떤 데이터가 계산되고 어떤 작업과 결합되어 출력을 생성하는지 추적하기 위해 계산 그래프 (계산 그래프)를 구축합니다. 자동 미분을 통해 시스템은 이후에 기울기를 역전파할 수 있습니다 . 여기서 역전파란 전체 계산 그래프를 추적하여 각 매개변수에 대한 부분 도함수를 채우는 것을 의미합니다.

2.5.1 간단한 예

  • 쌍 함수 y = 2 x ⊤ xy=2\mathbf{x}^{\top}\mathbf{x}라고 가정합니다.와이=2x _열 벡터 x \mathbf{x}에 대한 ​​xx 의 파생물
    import torch
    
    # 计算 y 关于 x 的梯度之前,需要⼀个地方来存储梯度,不会在每次对一个参数求导时都分配新的内存
    # 一个标量函数关于向量 x 的梯度是向量,并且与 x 具有相同的形状
    x = torch.arange(4.0, requires_grad=True)  # 等价于 x.requires_grad_(True) 
    y = 2 * torch.dot(x, x)
    y.backward()  # 调用反向传播函数来自动计算 y 关于 x 每个分量的梯度
    
    print(y)
    print(x.grad)  # 默认值是 None
    print(x.grad == 4 * x)  # y = 2(x^T)x 关于 x 的梯度应为 4x,此行代码为验证梯度计算是否正确
    
    # 输出
    tensor(28., grad_fn=<MulBackward0>)
    tensor([ 0.,  4.,  8., 12.])
    tensor([True, True, True, True])
    

2.5.2 비 스칼라 변수에 대한 역전파

  • yyy가 스칼라가 아닌 경우 벡터yy는벡터 xx에 대한 yx 의 도함수에 대한 가장 자연스러운 해석은고차 및 고차원yyyxxx , 파생 결과는 고차 텐서가 될 수 있습니다.
  • 그러나 벡터의 역계산을 호출할 때 일반적으로 훈련 샘플 배치에 있는 각 구성요소의 손실 함수의 도함수를 계산하려고 합니다. 여기서 목적은 미분 행렬을 계산하는 것이 아니라 다음의 편도함수 합을 계산하는 것입니다. 배치의 각 샘플을 별도로 처리합니다.
  • 역전파의 목적은 yy를 계산하는 것입니다.y는 xx에 대해x 의 미분, 즉dy / dx dy/dx를/ x . _ 연쇄법칙에 따르면dy / dx dy/dxd y / d x 같음/ dz dy/dzd y / d z 곱하기dz / dx dz/dxd z / d x , 여기서zzzyyyxxx 의 중간 변수입니다 . 또한yyxx yx 의 편미분은역전파에 의해 반환된 결과도 벡터이고x.grad x.grad에 저장됩니다.x .gr a ​​d _ _ _
    import torch
    
    x = torch.arange(4.0, requires_grad=True)
    y = 2 * torch.dot(x, x)
    y.backward()
    
    # 对⾮标量调⽤ backward 需要传⼊⼀个 gradient 参数,该参数指定微分函数关于 self 的梯度
    x.grad.zero_()  # 在默认情况下,PyTorch 会累积梯度,因此需要清除之前的值
    y = x * x
    # 给定 torch.ones(len(x)) 作为反向传播的输入,意味着将一个与 x 的长度相同的全 1 向量作为 y 对于自己的导数进行反向传播
    # 根据链式法则,这相当于求 dy/dy,即对 y 求导。由于 y 是一个函数,因此返回值将是与 x 的导数相关的向量
    y.sum().backward()  # 等价于 y.backward(torch.ones(len(x)))
    
    print(x.grad)
    
    # 输出
    tensor([0., 2., 4., 6.])
    

2.5.3 Python 제어 흐름의 기울기 계산

  • 자동 미분을 사용하는 한 가지 이점은 함수의 계산 그래프를 작성하려면 Python을 통한 제어 흐름(예: 조건문, 루프 또는 임의 함수 호출)이 필요한 경우에도 결과 변수의 기울기를 계속 계산할 수 있다는 것입니다. 아래 코드에서 while 루프의 반복 횟수와 if 문의 결과는 모두 입력 a의 값에 따라 달라집니다.
    import torch
    
    def f(a):
        b = a * 2
        while b.norm() < 1000:
            b = b * 2
            if b.sum() > 0:
                c = b
            else:
                c = 100 * b
            return c
    
    a = torch.randn(size=(), requires_grad=True)
    d = f(a)
    d.backward()
    
    print(a.grad == d / a)
    
    # 输出
    tensor(True)
    

2.6 확률

2.6.1 기본 확률 이론

  • 주사위를 굴려 1이 나올 확률이 무엇인지 알고 싶다고 가정해 보겠습니다. 주사위가 공평하다면 6개의 결과 {1,...,6}이 모두 발생할 가능성이 동일하므로 1이 나올 확률은 다음과 같습니다. 발생하는 것은 1/6 입니다. 대수의 법칙은 던지는 횟수가 증가함에 따라 이 추정치가 실제 기본 확률에 점점 더 가까워진다는 것을 알려줍니다.
  • 통계에서는 확률 분포에서 표본을 추출하는 과정을 표본 추출이라고 합니다.
    • 일반적으로 분포는 사건의 확률 분포로 간주될 수 있습니다.
    • 일부 불연속적인 선택에 확률을 할당하는 분포를 다항 분포라고 합니다.
  • 주사위를 굴리기 위한 샘플을 그리려면 확률 벡터를 전달하면 됩니다. 동일한 길이의 다른 벡터를 출력합니다. 인덱스 i의 값은 샘플링된 결과에서 i가 나타나는 횟수입니다. 1000번의 투척을 시뮬레이션할 수 있습니다. 그런 다음 1000번 던진 후 각 숫자가 몇 번 맞았는지 계산하고 실제 확률의 추정치로 상대 빈도를 계산합니다.
    import torch
    from torch.distributions import multinomial
    
    fair_probs = torch.ones([6]) / 6
    counts = multinomial.Multinomial(1000, fair_probs).sample()
    print(counts / 1000)  # 相对频率作为估计值
    
    # 输出(每个结果的真实概率约为 0.167)
    tensor([0.1600, 0.1840, 0.1700, 0.1650, 0.1670, 0.1540])
    
  • 이러한 확률은 각 세트에 10개의 샘플을 사용하여 500세트의 실험에 대해 시간이 지남에 따라 실제 확률로 수렴되는 것으로 볼 수 있습니다. 각 실선은 주사위의 6개 값 중 하나에 해당하며 각 실험 세트 후에 해당 값을 취하는 주사위의 추정 확률을 제공합니다. 이 6개의 실선은 더 많은 실험을 통해 더 많은 데이터를 얻을 때 실제 확률로 수렴됩니다.
    import torch
    import matplotlib.pyplot as plt
    from torch.distributions import multinomial
    
    fair_probs = torch.ones([6]) / 6
    counts = multinomial.Multinomial(10, fair_probs).sample((500,))
    cum_counts = counts.cumsum(dim=0)
    estimates = cum_counts / cum_counts.sum(dim=1, keepdim=True)
    
    def set_figsize(figsize=(6, 4.5)):
        plt.rcParams['figure.figsize'] = figsize
    
    for i in range(6):
        plt.plot(estimates[:, i].numpy(), label=("P(die=" + str(i + 1) + ")"))
    
    set_figsize((6, 4.5))
    plt.axhline(y=0.167, color='black', linestyle='dashed')
    plt.xlabel('Groups of experiments')
    plt.ylabel('Estimated probability')
    plt.legend()
    plt.show()  # plt.legend() 需要调用 plt.show() 来显示图例
    

여기에 이미지 설명을 삽입하세요

확률 이론의 공리
  • 주사위 던지기를 다룰 때 집합 S = { 1 , 2 , 3 , 4 , 5 , 6 } \mathcal{S}=\{1,2,3,4,5,6\}에스={ 1 ,2 ,3 ,4 ,5 ,6 } 은 샘플 공간(샘플 공간) 또는 결과 공간(결과 공간)이라고 하며, 여기서 각 요소는 결과입니다. 사건은 주어진 표본 공간 집합의 무작위 결과입니다. 예를 들어, "5를 보는 것"({5})과 "홀수를 보는 것"({1,3,5})은 모두 주사위를 굴리는 데 유효한 이벤트입니다.
  • 확률은 집합을 실제 값으로 매핑하는 함수 로 생각할 수 있습니다 . 주어진 표본공간 S \mathcal{S}S , 이벤트AAA 의 확률은 P(A)P(A)로 표현됩니다.P ( A ) 는 다음을 만족한다.
    • 모든 이벤트에 대해 AA확률이 결코 음수가 아닌 A , 즉P ( A ) > 0 P(A) > 0( )>0
    • 전체 표본공간의 확률은 1, 즉 P ( S ) = 1 P(\mathcal{S}) = 1( 에스 )=1
    • 상호 배타적인 사건의 경우: $P(A_1\cup A_2\cup A_3\cup…) = P(A_1)+P(A_2)+P(A_3)+\cdots $
무작위 변수
  • 산란체를 던지는 무작위 실험에서는 확률변수(Random Variable)라는 개념이 도입된다. 무작위 변수는 거의 모든 숫자일 수 있으며 무작위 실험의 가능성 집합 중에서 값을 취할 수 있습니다. 무작위 변수 XX를 고려하십시오.X , 그 값은 표본 공간S = { 1 , 2 , 3 , 4 , 5 , 6 } \mathcal{S}=\{1,2,3,4,5,6\}에스={ 1 ,2 ,3 ,4 ,5 ,6 } 인치 "5를 본다"는 사건은 다음과 같이 표현될 수 있습니다.{ X = 5 } {\{X = 5\}}{ 엑스=5 } 또는X = 5 X = 5엑스=도 5 에서 그 확률은 P ( { X = 5 } ) P(\{X=5\})로 표현됩니다.({ X=5 }) 또는P ( X = 5 ) P(X=5)( 엑스=5 )

    • P ( X ) P(X)는 다음과 같습니다.P ( X ) 는 확률 변수XXX 의 분포XX를X가 특정 값을 얻을
    • P(a)P(a)를 사용할 수 있습니다.P ( a )는 확률 변수가aa확률 _
  • 확률 이론의 사건은 표본 공간의 결과 집합이므로 임의 변수에 바람직한 값의 범위를 할당하는 것이 가능합니다. 예를 들어, P ( 1 ≤ X ≤ 3 ) P(1\leq X\leq3)( 1엑스3 ) 은 사건{ 1 ≤ X ≤ 3 } \{1\leq X\leq3\}을{ 1엑스3 },即{ X = 1 , 2 , 또는 , 3 } \{X=1,2,\mathrm{or},3\}{ 엑스=1 ,2 ,또는 _3 } 확률. 동등하게,P ( 1 ≤ X ≤ 3 ) P(1\leq X\leq3)( 1엑스3 )은 랜덤 변수XX를{ 1 , 2 , 3 } \{1,2,3\} X{ 1 ,2 ,3 } 값을 취할 확률

  • 이산 확률변수(예: 주사위의 각 면)와 연속 확률 변수(예: 사람의 체중 및 키) 사이에는 미묘한 차이가 있습니다. 다음 하위 섹션에서는 주로 이산 공간에서의 확률과 연속 확률 변수를 고려합니다. 확률 참조 for : 연속확률변수

2.6.2 다중 무작위 변수 다루기

결합 확률
  • 결합 확률 : P ( A = a , B = b ) P(A = a, B = b)( A=, _=)
    • 임의의 값이 주어지면 aaabbb ,A = a A = a=aB = b B = b=b가 두 가지를 모두 만족할
    • 어떤 aa 에 대해서도abbb 값은 다음을충족합니다. P ( A = a , B = b ) ≤ P ( A = a ) P(A=a,B=b)\leq P(A=a)( A=, _=)( A=a )P ( A = a , B = b ) ≤ P ( B = b ) P(A=a,B=b)\leq P(B=b)( A=, _=)( B=)
조건부 확률
  • 결합 확률의 부등식은 다음과 같은 흥미로운 비율로 이어집니다. 0 ≤ P ( A = a , B = b ) P ( A = a ) ≤ 1 0\leq\frac{P(A=a,B=b)}{P (A=a)}\leq10( A = a )P ( A = a , B = b )1,称这个比率为条件概率 (conditional probability),并用 P ( B = b ∣ A = a ) P(B=b\mid A=a) P(B=bA=a) 表示它: A = a A = a A=a 已发生的前提下, B = b B = b B=b 发生的概率
贝叶斯定理
  • 根据条件概率和乘法法则
    P ( A , B ) = P ( B ∣ A ) P ( A ) P(A,B)=P(B\mid A)P(A) P(A,B)=P(BA)P(A)

P ( A , B ) = P ( A ∣ B ) P ( B ) P(A,B)=P(A\mid B)P(B) P(A,B)=P(AB)P(B)

  • 于是得到贝叶斯定理
    P ( A ∣ B ) = P ( B ∣ A ) P ( A ) P ( B ) P(A\mid B)=\frac{P(B\mid A)P(A)}{P(B)} P(AB)=( )( BA ) P ( A )

    P(A,B)P(A,B)( 에이 ,B ) 는 결합 분포입니다.P ( A ∣ B ) P(A\mid B)( AB ) 는 조건부 분포입니다.

사회에서의 소외
  • 사건 확률을 합산하려면 합산 규칙, 즉 BB 가 필요합니다.B 의 확률은 AA를계산하는 것과 같습니다.A 의 가능한 모든 선택을 하고, 모든 선택의 공동 확률을 집계합니다. 이를소외화. 소외된 결과의 확률 또는 분포를 주변 확률 또는 주변 분포라고 합니다.
    P ( B ) = ∑ AP ( A , B ) P(B)=\sum_AP(A,B)( )=( 에이 ,)
독립
  • 두 개의 확률변수 AA 인 경우ABBB 는 독립적이며 사건AA를ABB사건 B 의 발생은
    • 이 경우 A ⊥ BA\perp B 로 표현하는 것이 일반적입니다.
    • 베이즈 정리에 따르면 P ( A ∣ B ) = P ( A ) P(A\mid B)=P(A) 는 즉시 구할 수 있습니다.( A)=( )
  • P ( A ∣ B ) = P ( A , B ) P ( B ) = P ( A ) P(A\mid B)=\frac{P(A,B)}{P(B)}=P ( ㅏ)( A)=( )P ( A , B )=P ( A )等了于P ( A , B ) = P ( A ) P ( B ) P(A,B)=P(A)P(B)( 에이 ,)=( A ) ( B )
    • 따라서 두 확률 변수는 다음과 같은 경우에만 독립적입니다. 두 확률 변수의 결합 분포는 해당 분포의 곱입니다.
  • 또 다른 확률 변수 CC 가 주어지면C 일 때 , 두 개의 확률변수AAABBB 는 조건부 독립입니다.P ( A , B ∣ C ) = P ( A ∣ C ) P ( B ∣ C ) P(A,B\mid C)=P(A\mid C)P(B\ C 중반)( 에이 ,)=( A) ( )
    • 이 상황은 A ⊥ B ∣ CA\perp B\mid C 로 표현됩니다 .

2.6.3 기대와 분산

  • 확률 분포의 주요 특성을 일반화하려면 몇 가지 측정이 필요합니다. 확률변수 XXX 의 기대값 (기대값 또는 평균(평균))
    E [ X ] = ∑ xx P ( X = x ) E[X]=\sum_xxP(X=x)E[X]=xxP(X=x)

  • 当函数 f ( x ) f(x) f(x) 的输入是从分布 P P P 中抽取的随机变量时, f ( x ) f(x) f(x) 的期望值为
    E x ∼ P [ f ( x ) ] = ∑ x f ( x ) P ( x ) E_{x\sim P}[f(x)]=\sum_xf(x)P(x) ExP[f(x)]=xf(x)P(x)

  • 在许多情况下,希望衡量随机变量 X X 기대값에서 X 의 편향 . 이는 분산
    V ar [ X ] = E [ ( X − E [ X ] ) 2 ] = E [ X 2 ] − E [ X ] 2 \mathrm{Var }[X ]=E\왼쪽[(XE[X])^2\오른쪽]=E[X^2]-E[X]^2 [ X ]=이자형[ ( 엑스-E [ X ] )2 ]=E [ 엑스2 ]-E [ 엑스 ]2

    분산의 제곱근을 표준편차라고 합니다.

  • 확률 변수의 함수 분산은 다음을 측정한 것입니다. 확률 변수의 분포에서 서로 다른 xx 값을 샘플링하는 경우x 일 때 함수 값은 예상되는 함수
    Var ⁡ [ f ( x ) ] = E [ ( f ( x ) − E [ f ( x ) ] ) 2 ] \operatorname{Var}[f(x) )] =E\왼쪽[\왼쪽(f(x)-E[f(x)]\오른쪽)^2\오른쪽]변수 [ f ( x )]=이자형[ ( f ( x )-E [ f ( x )] )2 ]

추천

출처blog.csdn.net/qq_42994487/article/details/132286834