深度学习:项目三

面经:

0.介绍bert模型的整体结构?

embedding->encoder->输出

1. embedding由哪些部分构成:

token embedding,position embedding ,segment embedding;

2. encoder层的作用是啥?由哪些部分组成?

通过信息交互,获得上下文信息

FFN,多头注意力机制,残差连接

3.介绍一下自注意力机制?

作用是让每个序列token 和其他序列token建立连接。做法是将输入映射为Q,K,V,向量,根据Q,K点积得到相关性分数,÷根号d缩放,(防止点积过大造成梯度不稳定问题)最后经过softmax得到权重,对V加权求和,从而得到上下文信息。

4.介绍多头注意力机制?

多头注意力机制就是在多个子空间内并行进行上述自注意力机制,输出结果进行拼接得到更丰富的结果。

5.介绍FFN层?

它就是由两个全连接层中间夹着一个激活函数组成的,负责信息转换和抽象。

6. bert全称和transformer的关系是啥?

bidirectional encoder representation from transformrs

bert 继承于transformer并且能同时从上下文左右两个方向理解文本。

7. 什么是bert预训练?

掩码模型预测和下一句预测。

8,本项目使用了什么损失函数?

交叉熵损失函数。

9。什么是迁移化学习:

利用大规模语料上训练好的模型做初始模型,在目标数据上进行微调。

C笔试

1.身份证长18其中714是生日编写整程2生日期先后

使用字符串型数组,一次性输入一串字符后会自动填充到数组各个位置;

数组名就是数组的首地址

#include <stdio.h>
#include<stdlib.h>
int judge(char a[19], char b[19]) {
	for (int i = 6; i < 14; i++) {
		if (a[i] > b[i]) return -1;
		if (a[i] <b[i]) return 1;

	}
	return 0;
}
int main() {
	char a[19] = { 0 }, b[19] = { 0 };
	printf_s("请输入第一个人的身份证号");#输入的号码会自动对应数组每个元素
	scanf_s("%s",a,19);#数组名就是地址
	printf_s("请输入第二个人的身份证号");
	scanf_s("%s",b,19);
	int result = judge(a, b);
	if (result == -1) printf_s("第二个人的生日在前");
	if (result  == 1) printf_s("第一个人的生日在前");
	if (result== 0) printf_s("两人生日一样");
	
	
    return 0;
}
	

2.寻找链表最大节点并移动

写完整序,大的结点然后动到链表 node由整data节点指next),不允申请新结点。

#include <stdio.h>
#include<stdlib.h>
typedef struct LNode{
int num;
struct LNode* next;
}LinkList;
int main() {
	LinkList* head = (LinkList*)malloc(sizeof(LinkList));
	head->next = NULL;
	LinkList* p, * q,*pre,*now,*pre1,*m;
	int max=-9999;
	q = head;
	int mm;
	printf_s("请输入键入的数字");
	for (int i = 0; i < 4; i++) {
		scanf_s("%d", &mm);
		m= (LinkList*)malloc(sizeof(LinkList));
		m->num = mm;
		q->next = m;
		q = m;
	}
	p = head->next;
	pre1 = head;
	while (p != NULL) {
		if ((p->num) > max) {
			max = p->num;
			now = p;
			pre = pre1;
		}
		p = p->next;
		pre1 = pre1->next;
	}

	pre->next = now->next;
	q->next = now;
	now->next = NULL;
	printf("调整后链表如下:\n");
	p = head->next;
	while (p != NULL) {
		printf_s("%d ", p->num);
		p = p->next;
	}

    return 0;
}
	

这个代码一直没跑出来,u1s1真的太复杂了,需要初始化的东西太多

3.快速排序 

编写一个函数把整数序列分成两个部分使得左边部分都不大于右边部分, 不需要排序。(考察的是快速排序的部分)

int huafen(int L, int R, int a[]) {
	int qivot = a[L];
	while (R > L) {
		while (a[R] > qivot && R > L) R--;
		a[L]=a[R];
		while (a[L] < qivot&& R>L) L++;
		a[R] = a[L];
	}
	a[L] = qivot;
	return L;
}
int main() {
	int L, R;
	int a[10];
	huafen(L, R, a);

	return 0;
}
	

4.二路归并

有两个整数数AB,它们分别mn个整数。并且都是按单增序列,BA单增

int guibin(int a[], int b[],int M,int N) {
	int am = 0;
	int bm = 0;
	int cm = 0;
	int c[100];
	while (am < M && bm < N) {
		if (a[am] > b[bm]) {
			c[cm++] = b[bm++];
		}
		else {
			c[cm++] = a[am++];
		}
	}
	while (am < M) c[cm++] = a[am++];
	while (bm < N) c[cm++] = b[bm++];
}
int main() {   #这里仅演示用法,不定义初始值
	guibin(a, b, m, n);
	return 0;
}
	

5. 链表逆置,链表按顺序插入

两个递增有序整数数列链LaLb将他们合并后变成一个新链表求该链表递减排序。

传参数时传头指针,就代表整个链表

#include <stdio.h>
#include<stdlib.h>
typedef struct LNode{
int num;
struct LNode* next;
}LinkList;
int Unit(LinkList*a, LinkList*b,int M,int N) {  #传指针即可,就代表一个链表
	LinkList* am =a;
	LinkList*bm =b;
	LinkList* c= (LinkList*)malloc(sizeof(LinkList));#只能离散的申请空间,不可以申请大片连续空间
	c->next = NULL;
	LinkList*cm =c; #对新建链表采用尾插法,需要指针c指向最后一个元素
	while (am!=NULL && bm!=NULL) {
		LinkList* newnode = (LinkList*)malloc(sizeof(LinkList));
		if (am->num >bm->num) {
			newnode->num = bm->num;
			bm = bm->next;
		}
		else {
			newnode->num = am->num;
			am = am->next;
		}
		c->next = newnode;
		newnode->next = NULL;
		cm = newnode;
	}
	while (am !=NULL ) {
		LinkList* newnode = (LinkList*)malloc(sizeof(LinkList));
		newnode->num = am->num;
		am = am->next;
		newnode->next = NULL;
		cm->next = newnode;
		cm = newnode;
	}

	while (bm != NULL) {
		LinkList* newnode = (LinkList*)malloc(sizeof(LinkList));
		newnode->num = bm->num;
		bm = bm->next;
		newnode->next = NULL;
		cm->next = newnode;
		cm = newnode;
	}
}
void reverse(LinkList* a) {
	LinkList* head= (LinkList*)malloc(sizeof(LinkList));
	head->next = NULL;
	LinkList* p = a->next;
	while (p != NULL) {
		a ->next= p->next;
		p->next=head->next ;
		head->next = p;
		p = a->next;#p要及时更新
	}

}

链表是真复杂啊一堆指针啊啊啊啊

数据库

面经

  1. DBMS支持的三种数据模型:层次模型、网状模型、关系模型的特点是什么?层次模型:数据组织像一棵倒挂的树,有且仅有一个根节点;网状模型:数据组织成网状,一个节点可以有多个父节点;关系:所有数据都放在一张张表里(行是记录,列是属性)如下图:

  2. 什么是数据独立性?包括哪两种?

    数据独立性表示应用程序与数据库中存储的数据不存在依赖关系,包括逻辑数据独立性和物理数据独立性。当数据库的存放方式表结构改变时,应用程序不用改
  3. 困死了不看了

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐