Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
家好,我是海擁,專注于前端知識的分享。今天將給大家帶來的是 400 個最常見的 JavaScript 面試問答第一部分。接下來我會持續更新(爭取日更,也可能每周3-5篇),每小節大概 10 道題左右,總共會有 400 多道。
大家一定要記得點贊收藏呀!!!
有很多方法可以在 javascript 中創建對象,如下所示
創建空對象的最簡單方法是使用 Object 構造函數。目前不推薦這種方法。
var object = new Object();
Object 的 create 方法通過將原型對象作為參數傳遞來創建一個新對象
var object = Object.create(null);
當傳遞 null 作為參數時,對象字面量語法等效于 create 方法
var object = {};
創建任何函數并應用 new 運算符來創建對象實例,
function Person(name){
var object = {};
object.name=name;
object.age=21;
return object;
}
var object = new Person("Sudheer");
這類似于函數構造函數,但它使用原型作為其屬性和方法,
function Person(){}
Person.prototype.name = "Sudheer";
var object = new Person();
這等效于使用具有函數原型的對象創建方法創建的實例,然后使用實例和參數作為參數調用該函數。
function func {};
new func(x, y, z);
(或者)
// 使用函數原型創建一個新實例。
var newInstance = Object.create(func.prototype)
// 調用函數
var result = func.call(newInstance, x, y, z),
// 如果結果是非空對象,則使用它,否則只使用新實例。
console.log(result && typeof result === 'object' ? result : newInstance);
ES6 引入類特性來創建對象
class Person {
constructor(name) {
this.name = name;
}
}
var object = new Person("Sudheer");
Singleton 是一個只能實例化一次的對象。對其構造函數的重復調用返回相同的實例,這樣可以確保它們不會意外創建多個實例。
var object = new function(){
this.name = "Sudheer";
}
原型鏈用于基于現有對象構建新類型的對象。它類似于基于類的語言中的繼承。
對象實例上的原型可通過Object.getPrototypeOf(object)或proto屬性獲得,而構造函數上的原型可通過Object.prototype 獲得。
Call、Apply 和 Bind 之間的區別可以用下面的例子來解釋,
call: call() 方法調用一個函數,給定的this值和參數一一提供
var employee1 = {firstName: 'Haiyong', lastName: 'Rodson'};
var employee2 = {firstName: 'Jimmy', lastName: 'Baily'};
function invite(greeting1, greeting2) {
console.log(greeting1 + ' ' + this.firstName + ' ' + this.lastName+ ', '+ greeting2);
}
invite.call(employee1, 'Hello', 'How are you?'); // Hello Haiyong Rodson, How are you?
invite.call(employee2, 'Hello', 'How are you?'); // Hello Jimmy Baily, How are you?
apply:調用具有給定this值的函數,并允許你將參數作為數組傳入
var employee1 = {firstName: 'Haiyong', lastName: 'Rodson'};
var employee2 = {firstName: 'Jimmy', lastName: 'Baily'};
function invite(greeting1, greeting2) {
console.log(greeting1 + ' ' + this.firstName + ' ' + this.lastName+ ', '+ greeting2);
}
invite.apply(employee1, ['Hello', 'How are you?']); // Hello Haiyong Rodson, How are you?
invite.apply(employee2, ['Hello', 'How are you?']); // Hello Jimmy Baily, How are you?
bind:返回一個新函數,允許你傳遞任意數量的參數
var employee1 = {firstName: 'Haiyong', lastName: 'Rodson'};
var employee2 = {firstName: 'Jimmy', lastName: 'Baily'};
function invite(greeting1, greeting2) {
console.log(greeting1 + ' ' + this.firstName + ' ' + this.lastName+ ', '+ greeting2);
}
var inviteEmployee1 = invite.bind(employee1);
var inviteEmployee2 = invite.bind(employee2);
inviteEmployee1('Hello', 'How are you?'); // Hello Haiyong Rodson, How are you?
inviteEmployee2('Hello', 'How are you?'); // Hello Jimmy Baily, How are you?
Call 和 apply 可以互換。兩者都立即執行當前函數。你需要決定是發送數組還是逗號分隔的參數列表更容易。你可以通過處理 Call 用于逗號(分隔列表)和 Apply 用于Array來記住。
而 Bind 創建一個新函數,該函數將this設置為傳遞給 bind() 的第一個參數。
JSON是一種基于文本的數據格式,遵循 JavaScript 對象語法,由道格拉斯·克羅克福德 (Douglas Crockford) 推行。 當你想通過網絡傳輸數據時它很有用,它基本上只是一個擴展名為 .json 的文本文件,以及一個 MIME 類型的 application/json
解析:將字符串轉換為原生對象
JSON.parse(text)
字符串化:將本機對象轉換為字符串,以便可以通過網絡傳輸
JSON.stringify(object)
所述slice()方法返回在數組作為新的數組對象中選定的元件。它選擇從給定開始參數開始的元素,并在給定的可選結束參數處結束,不包括最后一個元素。如果省略第二個參數,則它會一直選擇到最后。
這種方法的一些例子是,
let arrayIntegers = [1, 2, 3, 4, 5];
let arrayIntegers1 = arrayIntegers.slice(0,2); // returns [1,2]
let arrayIntegers2 = arrayIntegers.slice(2,3); // returns [3]
let arrayIntegers3 = arrayIntegers.slice(4); //returns [5]
==注意==: Slice 方法不會改變原始數組,而是將子集作為新數組返回。
splice() 方法用于向/從數組添加/刪除項目,然后返回被刪除的項目。第一個參數指定插入或刪除的數組位置,而選項第二個參數指示要刪除的元素數。每個附加參數都添加到數組中。
這種方法的一些例子是,
let arrayIntegersOriginal1 = [1, 2, 3, 4, 5];
let arrayIntegersOriginal2 = [1, 2, 3, 4, 5];
let arrayIntegersOriginal3 = [1, 2, 3, 4, 5];
let arrayIntegers1 = arrayIntegersOriginal1.splice(0,2); // returns [1, 2]; original array: [3, 4, 5]
let arrayIntegers2 = arrayIntegersOriginal2.splice(3); // returns [4, 5]; original array: [1, 2, 3]
let arrayIntegers3 = arrayIntegersOriginal3.splice(3, 1, "a", "b", "c"); //returns [4]; original array: [1, 2, 3, "a", "b", "c", 5]
==注意==: Splice 方法修改原始數組并返回刪除的數組。
表格形式的一些主要區別
slice() | splice() |
不修改原始數組(不可變) | 修改原始數組(可變) |
返回原始數組的子集 | 將刪除的元素作為數組返回 |
用于從數組中選取元素 | 用于在數組中插入或刪除元素 |
Object 與Maps 的相似之處在于,它們都允許您將鍵設置為值、檢索這些值、刪除鍵以及檢測某個鍵是否存儲了某些內容。由于這個原因,對象在歷史上被用作地圖。但是在某些情況下,使用 Map 有一些重要的區別。
JavaScript 提供了嚴格(===, !==) 和類型轉換(==, !=) 相等比較。嚴格運算符考慮變量的類型,而非嚴格運算符根據變量的值進行類型校正/轉換。嚴格的運算符遵循以下不同類型的條件,
NaN 不等于任何東西,包括 NaN。
正零和負零彼此相等。
0 == false // true
0 === false // false
1 == "1" // true
1 === "1" // false
null == undefined // true
null === undefined // false
'0' == false // true
'0' === false // false
[]==[] or []===[] //false, 引用內存中的不同對象
{}=={} or {}==={} //false, 引用內存中的不同對象
箭頭函數是函數表達式的較短語法,沒有自己的this、arguments、super 或 new.target。這些函數最適合非方法函數,它們不能用作構造函數。
希望大家能夠給海海 點贊+收藏+關注 ,你的支持是海海更新的動力!后面我會持續分享面試經驗 & 前端相關的專業知識。
最后祝大家都能找到滿意的實習和 offer!
位小伙伴們,繼續。接下來講解html基礎里面的簡答題的內容。
·什么是未否標準以及未否標準的構成?在這里面未否標準也稱之為王爺標準,它是有一系列的標準構成。這個地方有沒有問題?沒有。
·接下來主要講當前對應的內容,就是結構表現跟行為結構。在這里面是干什么的?比如主要分為hxml和hxmtml兩部分。表現用來是做裝飾,裝飾哪些?板式顏色大小及外觀樣式。則css行為。
·網頁模型里面定義和交互編寫,通常包括動模和ecmsk部分。在這里面可以演什么?叫做gs。
·在html中type標記常用的屬性有哪些?這個東西就是屬于日常里面一定要會的alone水平對齊方式,寬度、高度、背景顏色、邊框。sailor spacex指的是單元格跟單元格之間的間距。sailor pending叫做表格內部之間的邊距。在這里面之間解析過九十五的邊緣。
·這一部分內容指的是什么?就是pending。sailor pendingfund在這里面可以理解什么?表格外部的框架。
·在這里面有對應的內容,基本上都有下列選項中填上正確代碼。我是et標題,是不是只要寫個h1開頭,h1結尾,文字是不是寫p標簽?這個應該沒問題。
·減速html在vip標準中屬于哪個分層其作用?在這里面html是超文本標記語言的簡寫,是網頁三層中屬于當前對應的結構層負責。在這里面定義當前的內容和羽翼不負責樣式跟行為樣式對應的是css,行為對應的是js。
·減速網頁中常用的三種圖像格式:gp、png跟jpg、png和gp的公優點。在這里面gp優點是什么?常用的圖片格式,而且質量小便于傳輸,而且顏色會更加的逼真。
·缺點什么?不只是透明透明度,png是什么?就是支持透明透明度,有png-8跟png-24。
·缺點是什么?對瀏覽器的低端瀏覽器適應不好。gp圖片支持透明且是動效圖片,但缺點是什么?只能存不超過二五六顏色的內容。
·在這里面對應的信息可以暫停一下再讀一遍。如果想耍賴,其實在這里面把對方的優點寫成對應的缺點其實好像也是可以的,但是盡可能描述正確。
接下來請舉例常用的單標跟雙標。在這里面常用的雙標就是所見到的這一系列常用的單標是當前的BR跟HE。
·在這里面也可以去補充一些,但是算不算常用其實應該是主要一應該叫什么,主要在寫的時候過程當中知道的。
·在這里面請描述動態資源跟靜態資源。首先要知道什么叫動態,什么叫靜態。
→第一個要理解一個誤區,動態不是指指的會動就叫動態。動態一般指的是有數據的交互,數據的交互通常是網頁跟服務器之間的數據的發送信息,在這里面會導致頁面數據的更改。
→靜態資源是什么?就是直接加載會有一個具體的產線的內容,所以在這里面可以看到天臺資源有未可服務器讀取后直接返回,只要服務器沒有修改這些文件,用戶每次訪問都是一模一樣的。
→而動態資源是什么?隨著每次請求都需要計算,所以服務器里面如果在這里面當前的人員對當前的頁面已經改變,就會在服務器上面對應改,而下次傳回來的時候就有對應的改變的內容。
·接下來在這里面讀取當前對應的代碼。在這里面可以看到imagehrc這一整個,其實這里應該是多了一個符號,這個符號應該刪掉,所以它有點問題。這個表示加載不出來的時候顯示對應內容,這個是高度、寬度,這個是高度。
·這個波的是不是寫一個三對不對?完了之后在這里面懸停狀態時顯示logo的一個文本,這里面就推頭,在這里面就有對應的效果。記住這里面一般不要加服,不要加單位,hcss的時候是一定要加單位的,h t m 5的時候是可以不加。
解釋一下什么是h5,在這里面h5不僅練習到新標準而且是h t m l和x h t m l的繼承跟發展。h5是一個向下兼容的版本,本質上并不是什么新技術,而是在這個功能上做了一個極大的豐富,相當于一個方案的整合。
分析下列代碼并回答問題,僅減速代碼的作用,并且描述每個標記及其屬性的意義跟作用。
·首先p就是文本文檔里面展示了正在學習嵌套標記,同時這里面的文本的對齊屬性按照居中文字傾斜且文字加粗的效果,就這樣子。
·在這里面什么什么描述等于什么什么什么什么什么描述等于什么,給它講清楚。
·請簡要的描述htm語言中table常用的屬性有哪些?這個在題目里面其實已經講了很多次了。對應的邊框對應的單元格跟單元格之間的距離,單元格內部跟單元格邊框的距離,寬度、高度以及水平對齊方式。
·背景顏色和當前的單音表格的背景。
·請簡要描述定義列表的簽到形式。在這里面定義列表就是d l d t跟d d 其中d l,只能有一個d,d可以有多個,在這里面就有對應的內容不做描述,各位可以暫停簡單的看一下。
·接下來是常用的圖像格式,分別減速它們的作用。其實這道題目講過了,常用的圖像有三種:png、png。png就是動畫最多就二五六顏色,png常用于logo小圖標和單一的顏色。其實游戲網頁里面gif用的會比較多,因為可以生成動效的效果又是小動效,而且加載的時候資源也不會占用很大。
如果放視頻,視頻再小也是很大的。png在這里面有png-8和png-24,當然還有個png-32,一般用的比較少,默認png-24。png的優勢就是體積更小而且支持半透明,全透明和不透明都支持。
·接下來jpg,jpg的顏色會比gif和png來的更多,而且本身超過二五六顏色,所以基本上網頁里面的banana和商品圖片還有較大的圖片都常用jpg來進行保存。
描述gif、mr與h5的區別,h5文檔格式與gif、mr文檔格式基本沒有太大差異,僅僅只是gif、mr5的文檔更加的簡明扼要,以及文檔類型的聲明和編碼格式略有區別,其實gif、mr5的羽翼化更加明顯。
·接下來是什么叫相對路徑?什么叫絕對路徑?簡單的說相對路徑就是通過當前的文件去找對應的內容,上級點點斜杠,下級斜杠,等級直接找文件以及后綴名。而絕對路徑是通過盤符進行指定查找,但是一般在做絕對路徑的時候不太建議,理由很簡單,上傳到服務器的時候有些盤在服務器上面不一定有,就像前面講過的,常用的就在常用的瀏覽器有哪些,并不表示。
現實中常用的瀏覽器就是這些,我喜歡用qq瀏覽器,我喜歡用搜狐瀏覽器,這是常用的瀏覽器,但是它屬于五大瀏覽器嗎?它不屬于,就這么理解。怎樣的描述相對路徑?其實已經描述過了,在這里看到的是一模一樣的。各位可以暫停稍微看一遍。
請描述htm文檔中注視標記的作用,在這里面注視標記是方便去理解當前文檔里面的基本的代碼內容,就是方便查找和理解,就這么簡單。
接下來內容也就講完了,希望各希望當前的視頻對在座各位有一點點的幫助,謝謝。
讀:智能問答是人工智能領域中一個比較受關注的方向,目前廣泛應用于各種垂直或綜合的搜索引擎、智能客服、智能助手以及智能手機、車載音箱等。本次分享的主題是QQ瀏覽器搜索中的智能問答技術,主要分為以下幾個部分:
1.背景介紹
2.關鍵技術
3.前沿研究
01
背景介紹
1. 問答在搜索中的應用
問答的核心是通過理解語言和運用知識來進行提問和回答。從應用角度看,由于人類有獲取信息的需求和旺盛的好奇心,問答的場景無處不在;從研究角度看,問答是認知智能的前沿之一。
問答在搜索場景的應用可以分為兩類。一類是滿足用戶的直接搜索需求,即在搜索結果頁給用戶提供精準的答案,例如Top1問答卡片。另一類是通過問答的方式與用戶交互,來幫助用戶澄清、細化和延伸需求,例如推薦和對話形式的問答。
2. 搜索中的Top1問答
下圖展示了QQ瀏覽器搜索中Top1問答的一些產品形態,包括短答案、長答案、列表答案、視頻答案、集合和圖片答案。
--
02
關鍵技術
1. 搜索問答技術與系統
搜索中問答的明確需求占比接近1/4。這些問題不限領域,不限類型,一般可分成事實類和非事實類。搜索中問答的數據源是多種多樣的。從資源類型上看,包括網頁、UGC(用戶生產內容,如社區問答)和PGC(專業生產內容,例如自媒體號)。從文本的組織形態上來講,數據可以分成結構化、半結構化和無結構化三種。結構化的數據具有一定約束,以知識圖譜為代表;半結構化數據的典型代表是開放生態構建或者從社區問答抽取的具有一定格式的問答對數據;無結構化數據廣泛存在,例如普通的網頁文本。
搜索中的問答技術主要分為KBQA和DeepQA。
KBQA指基于知識圖譜的問答,面向的是結構化數據,底層是離線構建的知識圖譜,在線通過問題解析、圖譜查詢和推理得到答案,主要適用于事實類問題。
DeepQA是一系列基于搜索和機器閱讀理解(MRC)的問答技術,可以處理更廣泛的非結構化數據,基于離線問答內容構建和理解,在線通過搜索獲得候選文檔、使用機器閱讀理解技術來抽取答案,能解決更多問題需求類型。在實際應用中,針對不同類型的數據,我們構建了三套DeepQA系統,分別是優質問答數據源上的獨立檢索系統、全網搜索結合在線MRC的通用問答系統、以及端到端問答系統。
下圖右側展示的是搜索問答系統的整體架構。離線部分是問答內容的構建和理解,比如對專業生產內容做質量和權威性分析、從全網數據中進行問答對的挖掘和選取等;數據源包括網頁庫、優質問答庫和知識圖譜;在線部分包括搜索問答結果的召回和排序、段落匹配和答案抽取、知識圖譜檢索和推理計算等,以及問答融合決策從多源結果中決定最終展現給用戶的答案。
2. KBQA:基于知識圖譜的問答系統
圖譜問答系統的數據依據不同實體更新的要求分為三路,數據通過直接的三元組索引查詢或者圖數據庫存儲檢索系統應用。
在線圖譜問答的流水線之一是語義解析的方法,系統先對查詢進行領域分類以裝配不同類型的處理流程(例如漢語詩詞類、單實體類、多實體關系類),然后對查詢進行語法樹分析和形式邏輯規約,在三元組中遞歸查詢和拼裝得到最終答案。該方法的優點是支持一些復雜的查詢推理,且在規則適用的范疇內準確率較高。另一種流水線是基于深度學習的方法,系統首先識別出具有問答意圖的查詢,然后通過深度模型識別查詢問題中的實體,對實體屬性和查詢表達進行深度語義匹配映射,計算出候選結果并進行清洗和排序得到答案。該方法的優點是對查詢語義理解較好,泛化性強,召回率較高。
3. DeepQA:基于搜索+機器閱讀理解的問答系統
下面主要圍繞DeepQA相關工作展開介紹。
早期的DeepQA系統具有非常復雜的流水線,例如IBM的Waston,以及2017年第一版“立知“問答。系統包括多個數據挖掘和機器學習模塊,在問題分析、答案候選的特征抽取、評分排序等諸多環節都可能有錯誤的傳播和積累,可擴展性不強。2017年以后,斯坦福的陳丹琦等人提出了一個面向規模文檔集的開放域問答系統——DrQA,系統定義了一種新的開放域問答實現方式,即通過檢索和深度機器閱讀理解(MRC)產生答案。在SQuAD等公開數據集和評測的推動下,深度機器閱讀理解發展迅速,在查詢和文檔語義建模、上下文信息交互建模、答案抽取和預測方式建模上都不斷涌現新的方法,2019年機器閱讀理解系統甚至在事實類問答上超過了人類水平。
然而在真實的搜索場景中,DeepQA仍然面臨著很多挑戰。首先是用戶的需求紛繁復雜,表達方式也千差萬別,而互聯網數據規模巨大,需求檢索匹配的難度很大。其次是網頁數據多種多樣,頁面類型和格式繁多、質量參差、答案的形式不一,機器閱讀理解面臨較大的挑戰。
下面介紹一些應對搜索場景的問題我們所做的工作。
(1)短答案MRC
短答案MRC任務的定義是從搜索結果的多個文檔中抽取唯一的答案片段,并提供支持答案的文本來源。這個任務會面臨以下一些挑戰:
①搜索結果噪聲過多
噪聲包括不相關結果、不一致答案等。短答案抽取模型是一個多文檔段落抽取的模型,我們將搜索排名topN(常用N=10)的文檔段落輸入到BERT中進行表示建模,然后預測段落中答案的起始位置。為了解決輸入文檔不相關的問題,我們將“答案存在性判別”和“答案起止位置預測”兩個目標進行聯合訓練;為了應對各文檔的答案不一致問題,我們加入了多文檔交互,將多個文檔中包含答案概率最大的片段拼接起來進行建模,信息融合之后再預測文檔包含答案的概率。
②答案出現常識性錯誤
常識性錯誤即模型輸出無意義答案,例如邊界錯誤、答案類型錯誤。我們的做法是引入一些外部知識,例如百科、知識圖譜等,給候選文檔中符合答案類型的實體打上特殊的標記,在建模過程中加強對它們的關注。
③魯棒性問題
這里魯棒性問題指的是由于過擬合導致模型輸出不穩定。Dropout是一種有效的減少過擬合的方式,但它的缺點是不能保持輸出的一致性。我們應用了R-Drop,通過將Dropout作用于輸出層,降低了訓練和測試的不一致性,同時引入對稱KL散度作為正則項,增強了輸出的穩定性。在實驗過程中,我們發現對輸出層使用兩次dropout效果較好。此外我們還對訓練數據進行了同語義問題的數據增強,加入相同語義query下的段落輸出部分的KL-Loss,增強了模型的穩定性。
④答案歸一化和多span問題
在抽取式閱讀理解中,由于多文檔表述的不一致,往往會遇到答案歸一化的問題,比如“安全帶使用期限是幾年”的問題答案可能有“3到5年”、“3年至5年等”;而且還有答案并不是連續判斷,比如“沉魚落雁指的是誰”這個問題中,答案可能對應文檔中兩個片段(span)。為了解決上述問題,我們嘗試用生成式閱讀理解方法,以Fusion-in-Decoder(FiD)為例,將檢索得到的多文檔分別進行編碼表示,拼接起來輸入到decoder生成統一的答案。
實踐中利用大規模點擊日志文檔生成查詢進行預訓練,利用短答案日志構建大量弱監督數據進行自訓練,有效提升了生成式閱讀理解的效果。由于生成模型輸出的答案得分其實是語言模型的困惑度,不能很好地刻畫答案本身的置信度,我們訓練了一個生成答案的置信度預測模型,對答案輸出進行決策。
(2)長答案MRC
相比短答案,長答案MRC受到的研究關注相對較少,一方面因為問題更加復雜,數據集稀缺,另一方面因為長答案在內容和表達方式上有不確定性,評價起來也相對較難。
搜索場景中長答案和短答案主要有以下幾個方面的差異:
①長答案MRC-組合式問答
針對長答案包含信息量大、不連續的特點,我們提出了一種“組合式問答”的任務形式:從搜索結果的單個文檔中抽取出一組片段來合成精選摘要答案。任務輸入為給定問題和文檔的完整片段組合,輸出為答案片段組合。評價方式為片段預測的F1和人工評價相結合。
組合式問答模型的整體框架基于BERT,輸入是問題和進行了啟發式分句的文檔句子序列,輸出是每個句子是否是答案的概率。我們引入了兩個非常有用的設計。
第一個是引入頁面的結構信息。由于網頁的HTML能夠一定程度上反映頁面結構、文本關聯以及展示內容的重要度等特征,我們選擇了部分網頁標簽作為符號輸入到模型中。
第二個是引入針對性的預訓練任務。—般預訓練都是建模句子級別的關系,沒有有效挖掘文檔結構的信息;我們引入了兩類相關的預訓練任務,一類是問題選擇(QS),即隨機替換一個問題并預測;另一類是節點選擇(NS),可以對句子和符號進行隨機替換或打亂順序。這樣的預訓練任務可以讓模型更深刻地理解問題和長文本的內容。
由于文檔具有層級結構,一個自然的想法是利用圖網絡來建模。我們嘗試在模型輸出側增加圖網絡,將句子中詞的連接、句子之間的連接以及問題和句子的連接用圖結構表示并通過Attention Mask實現,實驗表明加入層次結構信息的效果提升明顯。
長答案閱讀理解中同樣可以采用短答案閱讀理解類似的思路:(1)同時預測文檔可答概率和答案句子概率;(2)引入門機制學習文檔和句子的關系;(3)使用R-drop提升魯棒性。
我們發現模型對問題的理解仍然不夠充分。舉一個極端的例子:當不輸入問題,直接針對文檔預測長答案,模型仍然能夠達到一定的抽取效果。說明閱讀理解模型輸出的答案受到文檔本身的影響較大,而對問題的關注不夠。為了解決這個問題,我們做了一些數據樣本增強和對抗的工作。一方面通過主動學習不斷優化訓練數據,讓模型學習到更多不會的能力,另一方面通過點擊日志挖掘同一個文檔下語義相同或不同的query。由于同一個文檔中的不同部分可以回答不同的問題,這樣可以讓模型更關注問題相關的信息,而不是文檔本身。
(3)長答案MRC-判斷類觀點問答
對于判斷類觀點問答任務,考慮到用戶不會僅僅滿足于論斷,而會更關心論據,我們設計了一個模型,首先抽取能夠回答問題的長答案,即論據,然后根據該論據做論斷的分類,產生一個短答案。
模型的整體結構是基于長答案模型結構的改進,在抽取長答案的同時,將query、title和長答案抽取過程中最高概率答案句拼接起來輸入判斷模塊。通過論據抽取和論點分類兩個目標的聯合學習,模型可以解決短答案抽取無法解決的問題。比如在下圖的例子中,對于“把兔子關在籠子里好嗎”這個問題,短答案抽取并不能直接抽取出“好”或者“不好”的答案片段,而通過分類可以知道它是一個否定的回答。
(4)問答式搜索
DeepQA的一個重要部分是從大規模數據檢索出相關候選文檔,才能通過閱讀理解模型抽取答案。傳統搜索更關注相關性,即文檔和問題相關,而問答更關注檢索結果是否能回答問題,這是問答式搜索和傳統搜索的不同。
問答式搜索系統需要一種更細粒度、更精準的語義檢索匹配方式。稠密段落檢索,即通過深度語義表示學習,從大規模文本中檢索出和查詢相關的段落,包括自然段、任意句子、詞片段。稠密段落檢索是稠密向量檢索的一種。傳統基于關鍵字詞構建的倒排檢索(稀疏檢索),雖能精確地召回結果,但是會面臨比較嚴重的語義鴻溝問題;而稠密向量檢索是解決查詢和文檔之間語義鴻溝的有效手段,但是從符號到向量的表示過程損失了一定的語義。所以需要對稠密向量表示進行優化,并設計合適的向量檢索和語義匹配方法。
問答式搜索也是一個從大規模數據到少量能抽取答案的文檔的金字塔式篩選過程。為了提高在線服務效率,在面向海量數據的召回和初排階段一般使用非交互式匹配模型,待檢索到一定規模的相關候選后再采用更精細化也更加耗時的交互式匹配模型。交互式和非交互式匹配模型各有其優缺點,如圖所示。
我們選用非交互式異形雙塔模型進行稠密段落檢索的Query-Passage語義表示學習。通過網頁搜索日志和問答對數據可以獲取大量的正負樣本,從而進行大規模對比學習。
這里介紹一種向量表示的優化方法——Barlow-Twins。通過在訓練目標里加上一個相關性去除目標,降低向量表示的冗余性,使得訓練出來的向量在空間的分布非常均勻。
負采樣方法是對比學習中非常重要的一環,對稠密向量表示效果有很大影響,我們對負采樣進行了兩個方面的優化:
一個是很多相關工作都會采用的Cross-batch負采樣,在多 GPU 并行訓練時,將其它 GPU 批次內的全部段落作為當前問題的負樣本,極大地增加了負樣本數,也使得訓練效率得到很大提升。Cross-batch負采樣還能緩解訓練和推理時負樣本分布的不一致性,因為在問答式搜索中,模型需要從大規模數據集中找到相關答案候選,但訓練過程見到的查詢段落樣本通常遠小于預測時的候選數據規模,這會導致模型在訓練時表現良好而在應用中不夠好。
另一個是提升負樣本的質量。一方面需要讓負樣本對模型來說更難,這樣能學習到更多的知識。另一方面要盡可能少地引入False Negative樣本。我們提出了混合降噪負采樣策略:先通過非降噪負采樣,例如已有的召回模型(BM25、初始訓練的召回模型等)進行Top-K采樣,這樣得到的樣本相對較難,當然也會引入一些False Negative;然后進行降噪負采樣,通過訓練一個Re-ranker對樣本進行篩選,去除實際可能是正例的噪聲;兩者結合訓練,實驗證明效果提升非常明顯。
召回階段的核心任務是區分答案相關和不相關的候選,召回之后就需要通過匹配更進一步排序這些候選文檔。這里簡要介紹一下我們的Query-Passage交互匹配模型。
模型訓練主要分三個階段,首先利用大規模網頁數據,包括百科、微信、知乎以及問答點擊頁面等多樣的數據進行預訓練;接下來是對比式弱監督訓練,通過點擊和曝光未點擊數據、問答對結合負采樣構造正負樣本;最后在人工標注的問答匹配數據上進行訓練。人工標注的樣本有四類標簽,分別是完全不相關、相關、能部分回答問題、能完整地很好回答問題。為了進一步提升模型效果,我們還使用了自訓練技術,利用人工標注數據訓練模型之后,通過該模型進行大量的自動化標注并從中篩選一些高質量標注數據,繼續訓練原始模型。多次迭代之后,模型的泛化性能會有較大的提升。
--
03
前沿研究
下面介紹開放域智能問答的一些相關前沿研究和進展。
1. 端到端問答
近年來關于開放域端到端問答的研究如火如荼,下圖摘自ACL 2020 Tutorial: Open domain question and answering,對端到端問答系統發展的總結。
第一代端到端問答模型采取兩階段的方式,通過檢索器和閱讀器串聯來進行答案提取,例如DrQA;前面我們所講的DeepQA系統也是遵循這種范式的設計;第二代的模型為閱讀器和檢索器聯合優化的模型,如R3、DenSPI;第三代的模型不需要檢索器,直接通過模型生成答案,如T5、GPT3。
檢索器和閱讀器的聯合優化是一個難點。一種方法是將檢索的文檔看做隱變量,依靠EM優化語義表示模型和生成模型,即通過閱讀器的輸出概率作為檢索器優化的目標,反過來再基于檢索器的輸出優化閱讀器的輸出概率。這樣交替進行同時提升閱讀器和檢索器的效果。我們嘗試了一種Hard-EM的方法,直接把預測答案是否包含于檢索文檔作為硬匹配信號來優化文檔檢索的過程。如下圖所示,通過答案硬匹配文檔獲得訓練三元組<q, d, a>,然后訓練FiD答案抽取模型,再利用新的答案抽取模型預測出來的更優質的答案,繼續硬匹配和過濾候選文檔輸入。幾輪循環之后答案抽取的EM和F1指標均得到提升。
2. 知識指導的問答
如何在深度模型中引入知識也是問答研究的熱點。真實場景中有很多問題需要知識推理,比如“小汽車科目二多少分及格”這個問題,示例的法規文本里沒有明確的描述,但是可以根據推理得到答案;“葡萄籽油的食用方法”這個問題,不同答案中包含的“知識點”相互存在沖突和分歧,需要進行知識驗證。
知識指導的問答相關工作,有一種是把特定的知識輸入到答案抽取模型一起學習,比如K-BERT,把原輸入中實體所涉及到的三元組通過軟位置編碼的方式融合到輸入中,從而引入了實體相關的知識。另一類方法是通過知識增強的預訓練模型提升下游任務的效果。
QQ瀏覽器搜索內容技術團隊還提出了一種知識增強預訓練的方法,該模型引入了三類知識性任務,包括遠程關系監督分類、三元組文本mask預測、以及同類實體替換預測,訓練過程中將這三類任務和語言模型任務結合在一起訓練。為了保證原始模型的參數在訓練過程中不會有災難性遺忘,設計了一個新的知識記憶結構,將原有模型的所有參數固定住,只用這個新的知識記憶矩陣承載上面多任務引入的知識。實驗證明知識增強的預訓練在很多下游任務上都能夠獲得一定的提升,尤其是在上下文不充分的短文本任務上。
3. 多模態問答
當前越來越多的優質內容以視頻形式存在,從文本答案到視頻答案也是一個大的趨勢。基于視頻載體的問答需要對視頻內容進行感知分析+語義分析,進而通過顯示/隱式的語義表示和計算(檢索、匹配、閱讀、生成)得到視頻化的答案。
我們現在做的一個比較初步的工作是利用視頻的語音和字幕進行視頻文本化,然后通過閱讀理解結合文本生成的技術進行視頻答案摘要,通過文本生成和字幕時間匹配,還能得到視頻分段以及關鍵幀標簽。右圖是我們在視頻問答做出來的短答案摘要的效果,相對于文本答案可以給用戶提供更多便捷性的幫助。未來還有更多基于多模態內容的問答研究值得探索。
--
04
Q&A
Q1:針對用戶的query,KBQA和DeepQA的執行順序是什么?
A1:兩者是同步進行的,最后根據答案產生的情況做決策。DeepQA這邊還會有一個問題分類的模塊,判斷問題的答案是短答案還是長答案。所以底層是多個系統的并行,包括KBQA系統、短答案系統和長答案系統。
Q2:自己嘗試后發現DeepQA的響應非常慢,工業應用中通過什么方式來提高問答響應的速度?
A2:響應的速度分為兩個方面,檢索模塊和閱讀理解模塊的響應。需要看這兩部分分別耗時,也需要分別優化。檢索模塊往往會通過分層篩選的方式來限制輸入文本的數量。計算越復雜的模塊,輸入文本數量越少。召回階段我們采用非交互式模型快速獲得相關文本,排序階段再使用更復雜的交互式模型進行少量精細化計算。最后閱讀理解模塊的文本輸入相對更少了,目前只針對Top10結果去做計算。以上是系統層面的優化。
具體到模型優化的話,可能就會需要具體看輸入的文本長度、模型復雜度,模型所使用的推理系統,推理器和硬件的匹配情況等。最主要的是需要去分析響應時間慢的瓶頸的問題,然后再針對性解決。
Q3:針對用戶的query也會有拼寫糾錯的處理,什么時候會觸發這個處理?怎么處理?
A3:糾錯不是問答獨有的問題,是整個搜索系統面臨的問題。在搜索的最開始也就是查詢分析的模塊,不僅有糾錯,還有查詢的分詞,查詢重要度的分析,查詢詞之間的關系分析等。糾錯往往是搜索前置的模塊,糾錯之后的處理也會有不同,比如對置信度非常高的糾錯,可以直接修改查詢。系統更保險的做法是觸發二次查詢,也就是將原詞的搜索結果和糾錯后的搜索結果同時拿到,然后再根據結果的反饋綜合決策。
今天的分享就到這里,謝謝大家。
分享嘉賓:姚婷 騰訊 專家研究員
編輯整理:王惠靈 合肥工業大學
出品平臺:DataFunTalk
01/分享嘉賓
姚婷|騰訊 專家研究員
畢業于清華大學計算機系,從事自然語言處理、搜索排序、智能問答方向的研究工作,負責主導了搜狗搜索“立知”問答系統研發。目前擔任騰訊PCG搜索應用部專家研究員,負責QQ瀏覽器搜索中智能問答技術的研究和落地應用。
02/關于我們
DataFun:專注于大數據、人工智能技術應用的分享與交流。發起于2017年,在北京、上海、深圳、杭州等城市舉辦超過100+線下和100+線上沙龍、論壇及峰會,已邀請超過2000位專家和學者參與分享。其公眾號 DataFunTalk 累計生產原創文章700+,百萬+閱讀,14萬+精準粉絲。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。